From: <bma...@us...> - 2009-01-23 16:12:48
|
Revision: 4396 http://fudaa.svn.sourceforge.net/fudaa/?rev=4396&view=rev Author: bmarchan Date: 2009-01-23 16:12:37 +0000 (Fri, 23 Jan 2009) Log Message: ----------- Task#36: Possibilit?\195?\169 d'accrocher les sommets des g?\195?\169om?\195?\169tries lors de la cr?\195?\169ation de g?\195?\169om?\195?\169trie ou lors du calcul de distance. Modified Paths: -------------- branches/FudaaModeleur_TC1Bis/fudaa_devel/ebli/src/org/fudaa/ebli/calque/ZCalqueAffichageDonnees.java branches/FudaaModeleur_TC1Bis/fudaa_devel/ebli/src/org/fudaa/ebli/calque/ZCalqueAffichageDonneesAbstract.java branches/FudaaModeleur_TC1Bis/fudaa_devel/ebli/src/org/fudaa/ebli/calque/ZCalqueAffichageDonneesInterface.java branches/FudaaModeleur_TC1Bis/fudaa_devel/ebli/src/org/fudaa/ebli/calque/ZCalqueGeometry.java branches/FudaaModeleur_TC1Bis/fudaa_devel/ebli/src/org/fudaa/ebli/calque/ZCalqueLigneBrisee.java branches/FudaaModeleur_TC1Bis/fudaa_devel/ebli/src/org/fudaa/ebli/calque/ZEbliCalquePanelController.java branches/FudaaModeleur_TC1Bis/fudaa_devel/ebli/src/org/fudaa/ebli/calque/ZEbliCalquesPanel.java branches/FudaaModeleur_TC1Bis/fudaa_devel/ebli/src/org/fudaa/ebli/calque/ZModeleDonnees.java branches/FudaaModeleur_TC1Bis/fudaa_devel/ebli/src/org/fudaa/ebli/calque/ZModeleDonneesVide.java branches/FudaaModeleur_TC1Bis/fudaa_devel/ebli/src/org/fudaa/ebli/calque/ZModeleDonnesAbstract.java branches/FudaaModeleur_TC1Bis/fudaa_devel/ebli/src/org/fudaa/ebli/calque/ZModeleFlecheForGrille.java branches/FudaaModeleur_TC1Bis/fudaa_devel/ebli/src/org/fudaa/ebli/calque/ZModeleGeometry.java branches/FudaaModeleur_TC1Bis/fudaa_devel/ebli/src/org/fudaa/ebli/calque/ZModeleStatiquePoint.java branches/FudaaModeleur_TC1Bis/fudaa_devel/ebli/src/org/fudaa/ebli/calque/ZScene.java branches/FudaaModeleur_TC1Bis/fudaa_devel/ebli/src/org/fudaa/ebli/calque/edition/ZCalqueDistanceInteraction.java branches/FudaaModeleur_TC1Bis/fudaa_devel/ebli/src/org/fudaa/ebli/calque/edition/ZCalqueEditionInteraction.java branches/FudaaModeleur_TC1Bis/fudaa_devel/ebli/src/org/fudaa/ebli/calque/edition/ZEditionAttibutesContainer.java branches/FudaaModeleur_TC1Bis/fudaa_devel/ebli/src/org/fudaa/ebli/calque/edition/ZEditionAttributesDataI.java branches/FudaaModeleur_TC1Bis/fudaa_devel/ebli/src/org/fudaa/ebli/calque/edition/ZModeleGeometryDefault.java branches/FudaaModeleur_TC1Bis/fudaa_devel/ebli/src/org/fudaa/ebli/commun/EbliListeSelectionMulti.java branches/FudaaModeleur_TC1Bis/fudaa_devel/fudaa/src/org/fudaa/fudaa/meshviewer/model/MvEdgeModelDefault.java branches/FudaaModeleur_TC1Bis/fudaa_devel/fudaa/src/org/fudaa/fudaa/reflux/RefluxMaillage.java branches/FudaaModeleur_TC1Bis/fudaa_devel/fudaa/src/org/fudaa/fudaa/reflux/RefluxModeleNoeud.java branches/FudaaModeleur_TC1Bis/fudaa_devel/fudaa/src/org/fudaa/fudaa/sig/FSigLineSingleModel.java branches/FudaaModeleur_TC1Bis/fudaa_devel/fudaa/src/org/fudaa/fudaa/sig/wizard/FSIgImageWizartStepCalageUI.java branches/FudaaModeleur_TC1Bis/fudaa_devel/fudaa/src/org/fudaa/fudaa/tr/data/TrSiFlecheModel.java branches/FudaaModeleur_TC1Bis/fudaa_devel/fudaa/src/org/fudaa/fudaa/tr/post/TrIsoModelEltDataAdapter.java branches/FudaaModeleur_TC1Bis/fudaa_devel/fudaa/src/org/fudaa/fudaa/tr/post/TrPostFlecheModel.java branches/FudaaModeleur_TC1Bis/fudaa_devel/fudaa/src/org/fudaa/fudaa/tr/reflux/TrBcNodeLayer.java branches/FudaaModeleur_TC1Bis/fudaa_devel/fudaa/src/org/fudaa/fudaa/tr/telemac/TrTelemacSourceModel.java Added Paths: ----------- branches/FudaaModeleur_TC1Bis/fudaa_devel/ebli/src/org/fudaa/ebli/calque/ZCalqueCatchInteraction.java branches/FudaaModeleur_TC1Bis/fudaa_devel/ebli/src/org/fudaa/ebli/calque/ZCatchEvent.java branches/FudaaModeleur_TC1Bis/fudaa_devel/ebli/src/org/fudaa/ebli/calque/ZCatchListener.java branches/FudaaModeleur_TC1Bis/fudaa_devel/ebli/src/org/fudaa/ebli/calque/ZSceneSelection.java branches/FudaaModeleur_TC1Bis/fudaa_devel/ebli/src/org/fudaa/ebli/ressource/curseur_accroche.gif Property Changed: ---------------- branches/FudaaModeleur_TC1Bis/fudaa_devel/ebli/src/org/fudaa/ebli/calque/ZModeleDonneesVide.java branches/FudaaModeleur_TC1Bis/fudaa_devel/ebli/src/org/fudaa/ebli/calque/ZModeleDonnesAbstract.java branches/FudaaModeleur_TC1Bis/fudaa_devel/ebli/src/org/fudaa/ebli/calque/ZModeleFlecheForGrille.java branches/FudaaModeleur_TC1Bis/fudaa_devel/ebli/src/org/fudaa/ebli/calque/ZModeleStatiquePoint.java branches/FudaaModeleur_TC1Bis/fudaa_devel/ebli/src/org/fudaa/ebli/calque/edition/ZCalqueEditionInteraction.java branches/FudaaModeleur_TC1Bis/fudaa_devel/ebli/src/org/fudaa/ebli/calque/edition/ZEditionAttibutesContainer.java branches/FudaaModeleur_TC1Bis/fudaa_devel/ebli/src/org/fudaa/ebli/calque/edition/ZEditionAttributesDataI.java branches/FudaaModeleur_TC1Bis/fudaa_devel/ebli/src/org/fudaa/ebli/commun/EbliListeSelectionMulti.java branches/FudaaModeleur_TC1Bis/fudaa_devel/fudaa/src/org/fudaa/fudaa/meshviewer/model/MvEdgeModelDefault.java branches/FudaaModeleur_TC1Bis/fudaa_devel/fudaa/src/org/fudaa/fudaa/reflux/RefluxMaillage.java branches/FudaaModeleur_TC1Bis/fudaa_devel/fudaa/src/org/fudaa/fudaa/reflux/RefluxModeleNoeud.java branches/FudaaModeleur_TC1Bis/fudaa_devel/fudaa/src/org/fudaa/fudaa/sig/FSigLineSingleModel.java branches/FudaaModeleur_TC1Bis/fudaa_devel/fudaa/src/org/fudaa/fudaa/sig/wizard/FSIgImageWizartStepCalageUI.java branches/FudaaModeleur_TC1Bis/fudaa_devel/fudaa/src/org/fudaa/fudaa/tr/data/TrSiFlecheModel.java branches/FudaaModeleur_TC1Bis/fudaa_devel/fudaa/src/org/fudaa/fudaa/tr/post/TrIsoModelEltDataAdapter.java branches/FudaaModeleur_TC1Bis/fudaa_devel/fudaa/src/org/fudaa/fudaa/tr/post/TrPostFlecheModel.java branches/FudaaModeleur_TC1Bis/fudaa_devel/fudaa/src/org/fudaa/fudaa/tr/reflux/TrBcNodeLayer.java branches/FudaaModeleur_TC1Bis/fudaa_devel/fudaa/src/org/fudaa/fudaa/tr/telemac/TrTelemacSourceModel.java Modified: branches/FudaaModeleur_TC1Bis/fudaa_devel/ebli/src/org/fudaa/ebli/calque/ZCalqueAffichageDonnees.java =================================================================== --- branches/FudaaModeleur_TC1Bis/fudaa_devel/ebli/src/org/fudaa/ebli/calque/ZCalqueAffichageDonnees.java 2009-01-23 10:39:23 UTC (rev 4395) +++ branches/FudaaModeleur_TC1Bis/fudaa_devel/ebli/src/org/fudaa/ebli/calque/ZCalqueAffichageDonnees.java 2009-01-23 16:12:37 UTC (rev 4396) @@ -230,16 +230,16 @@ * * @param _pt coordonnees reelles * @param _tolerance - * @return la liste des indexs selectionnes (ou null si aucune selection) + * @return la liste des index des objets selectionnes (ou null si aucune selection) */ public abstract CtuluListSelection selection(GrPoint _pt, int _tolerance); /** - * renvoie la liste des points selectionnes par le polygone <code>_poly</code>. + * renvoie la liste des objets selectionnes par le polygone <code>_poly</code>. * * @param _poly le polygone EN coordonnees reelles * @param _mode TODO - * @return la liste des indexs ( ou null si aucun selectionne). + * @return la liste des indexs des objets selectionn\xE9s ( ou null si aucun selectionne). */ public abstract CtuluListSelection selection(LinearRing _poly, int _mode); Modified: branches/FudaaModeleur_TC1Bis/fudaa_devel/ebli/src/org/fudaa/ebli/calque/ZCalqueAffichageDonneesAbstract.java =================================================================== --- branches/FudaaModeleur_TC1Bis/fudaa_devel/ebli/src/org/fudaa/ebli/calque/ZCalqueAffichageDonneesAbstract.java 2009-01-23 10:39:23 UTC (rev 4395) +++ branches/FudaaModeleur_TC1Bis/fudaa_devel/ebli/src/org/fudaa/ebli/calque/ZCalqueAffichageDonneesAbstract.java 2009-01-23 16:12:37 UTC (rev 4396) @@ -29,6 +29,7 @@ import org.fudaa.ebli.controle.BSelecteurLineModel; import org.fudaa.ebli.geometrie.GrBoite; import org.fudaa.ebli.geometrie.GrMorphisme; +import org.fudaa.ebli.geometrie.GrPoint; import org.fudaa.ebli.palette.BPalettePlage; import org.fudaa.ebli.palette.BPalettePlageAbstract; import org.fudaa.ebli.palette.BPalettePlageDiscret; @@ -292,6 +293,10 @@ public EbliListeSelectionMultiInterface getLayerSelectionMulti() { return null; } + + public EbliListeSelectionMultiInterface selectionMulti(GrPoint _ptReel, int _tolerancePixel, boolean _inDepth) { + return null; + } public BPalettePlageInterface getPaletteCouleur() { return paletteCouleur_; Modified: branches/FudaaModeleur_TC1Bis/fudaa_devel/ebli/src/org/fudaa/ebli/calque/ZCalqueAffichageDonneesInterface.java =================================================================== --- branches/FudaaModeleur_TC1Bis/fudaa_devel/ebli/src/org/fudaa/ebli/calque/ZCalqueAffichageDonneesInterface.java 2009-01-23 10:39:23 UTC (rev 4395) +++ branches/FudaaModeleur_TC1Bis/fudaa_devel/ebli/src/org/fudaa/ebli/calque/ZCalqueAffichageDonneesInterface.java 2009-01-23 16:12:37 UTC (rev 4396) @@ -129,6 +129,19 @@ boolean changeSelection(LinearRing[] _p, int _action, int _mode); /** + * Retourne les indices de selection des sous objets selectionn\xE9s pour le point donn\xE9, sous la forme d'une liste de selection. + * La selection s'effectue du point le plus au dessus vers le point le plus en dessous.<p> + * Le plus souvent les sous objets selectionn\xE9s sont des sommets (points). + * + * @param _ptReel Le point donn\xE9 pour la selection. + * @param _tolerancePixel La tol\xE9rance, en pixels. + * @param _inDepth Si faux, la recherche s'arrete a la premi\xE8re occurence trouv\xE9e. Sinon, la recherche continue pour tous les + * points suceptibles d'etre selectionn\xE9s. + * @return Les indices des sous objets selectionn\xE9s, ou null si aucune selection. + */ + EbliListeSelectionMultiInterface selectionMulti(GrPoint _ptReel, int _tolerancePixel, boolean _inDepth); + + /** * @return la ligne repr\xE9sentant la s\xE9lection courant. null si s\xE9lection non adequate */ LineString getSelectedLine(); Added: branches/FudaaModeleur_TC1Bis/fudaa_devel/ebli/src/org/fudaa/ebli/calque/ZCalqueCatchInteraction.java =================================================================== --- branches/FudaaModeleur_TC1Bis/fudaa_devel/ebli/src/org/fudaa/ebli/calque/ZCalqueCatchInteraction.java (rev 0) +++ branches/FudaaModeleur_TC1Bis/fudaa_devel/ebli/src/org/fudaa/ebli/calque/ZCalqueCatchInteraction.java 2009-01-23 16:12:37 UTC (rev 4396) @@ -0,0 +1,250 @@ +/* + * @file BCalqueSuiviSourisInteraction.java + * @creation 1998-10-16 + * @modification $Date: 2006-09-19 14:55:46 $ + * @license GNU General Public License 2 + * @copyright (c)1998-2001 CETMEF 2 bd Gambetta F-60231 Compiegne + * @mail de...@fu... + */ +package org.fudaa.ebli.calque; + +import java.awt.event.KeyEvent; +import java.awt.event.KeyListener; +import java.awt.event.MouseEvent; +import java.awt.event.MouseListener; +import java.awt.event.MouseMotionListener; +import java.util.HashSet; + +import org.fudaa.ebli.geometrie.GrPoint; +/** + * Un calque pour accrocher les objets de la scene. Si la scene n'existe pas, pas d'objets accroch\xE9. + * Des modificateurs permettent l'accrochage ou non (key SHIFT). + * + * @author Bertrand Marchand + * @version $Id$ + */ +public class ZCalqueCatchInteraction extends BCalqueInteraction implements + MouseMotionListener, MouseListener, KeyListener { + + /** La tol\xE9rance en pixels pour l'accrochage */ + private static int tolerancePixel_=4; + /** La scene */ + private ZScene scene_; + /** Un point temporaire remis a jour a chaque mouvement de souris */ + private GrPoint ptTmp_=new GrPoint(); + /** True si le mode d'accrochage est actif */ + private boolean bcatch_=true; + /** Les listeners de l'accrochage */ + private HashSet<ZCatchListener> listeners_=new HashSet<ZCatchListener>(); + /** La liste de selection des points d'accrochage */ + private ZSceneSelection selAccroch_=null; + /** Le tableau des indices de g\xE9om\xE9tries accroch\xE9es */ + private int[] idxGeoms_; + /** Le tableau des indices de sommets accroch\xE9s */ + private int[] idxVertices_; + /** L'indice sur les indices de g\xE9om\xE9tries */ + private int iidxGeom_=-1; + /** L'indice sur les indices de vertices */ + private int iidxVertex_=-1; + + public ZCalqueCatchInteraction() {} + + /** + * Methode inactive. + */ + public void mouseDown(final MouseEvent _evt){} + + /** + * Methode inactive. + */ + public void mouseEntered(final MouseEvent _evt){} + + /** + * Methode inactive. + */ + public void mouseExited(final MouseEvent _evt){} + + /** + * Methode inactive. + */ + public void mousePressed(final MouseEvent _evt){} + + /** + * Methode inactive. + */ + public void mouseReleased(final MouseEvent _evt){} + + /** + * Methode inactive. + */ + public void mouseUp(final MouseEvent _evt){} + + /** + * Methode inactive. + */ + public void mouseClicked(final MouseEvent _evt){} + + /** + * Appelle la methode <I>mouseMoved</I>. + */ + public void mouseDragged(final MouseEvent _evt){ + mouseMoved(_evt); + } + + /** + * Envoi d'un evenement <I>ZCatchEvent</I> (en mode non gele). + */ + public void mouseMoved(final MouseEvent _evt){ + ptTmp_.x_=_evt.getX(); + ptTmp_.y_=_evt.getY(); + + if (!isGele() && scene_!=null && bcatch_) { + mouseMoved(ptTmp_); + } + } + + /** + * Recherche les points a accrocher. Propose par defaut le plus en avant. + * @param _pt + */ + public void mouseMoved(GrPoint _pt) { + if (scene_==null) return; + + int idxGeomOld=-1; + int idxVertexOld=-1; + if (iidxGeom_!=-1) { + idxGeomOld=idxGeoms_[iidxGeom_]; + idxVertexOld=idxVertices_[iidxVertex_]; + } + + selAccroch_=scene_.selection(_pt.applique(getVersReel()), tolerancePixel_); + idxGeoms_=selAccroch_.getIdxSelected(); + + int igeom=-1; + int ivertex=-1; + + if (idxGeoms_.length!=0) { + igeom=0; + // Recherche dans le nouveau tableau de l'indice. + if (idxGeomOld!=-1) { + for (int i=0; i<idxGeoms_.length; i++) { + if (idxGeoms_[i]==idxGeomOld) { + igeom=i; + break; + } + } + } + idxVertices_=selAccroch_.getSelection(idxGeoms_[igeom]).getSelectedIndex(); + if (idxVertices_.length!=0) { + ivertex=0; + } + // Recherche dans le nouveau tableau de l'indice. + if (idxVertexOld!=-1) { + for (int i=0; i<idxVertices_.length; i++) { + if (idxVertices_[i]==idxGeomOld) { + ivertex=i; + break; + } + } + } + } + + if (ivertex==-1) { + if (iidxVertex_!=-1) { + fireCatchEvent(ZCatchEvent.UNCAUGHT,0,0); + } + } + else if (iidxVertex_==-1) { + if (ivertex!=-1) { + fireCatchEvent(ZCatchEvent.CAUGHT,idxGeoms_[igeom],idxVertices_[ivertex]); + } + } + else if (idxGeomOld!=idxGeoms_[igeom] || idxVertexOld!=idxVertices_[ivertex]) { + fireCatchEvent(ZCatchEvent.UNCAUGHT,0,0); + fireCatchEvent(ZCatchEvent.CAUGHT,idxGeoms_[igeom],idxVertices_[ivertex]); + } + + iidxGeom_=igeom; + iidxVertex_=ivertex; + } + + /** + * Definit la tol\xE9rence d'accrocahge. + * @param _tolPixel La tolerance, en pixel. + */ + public void setTolerance(int _tolPixel) { + tolerancePixel_=_tolPixel; + } + + /** + * Definit la scene. + * @param _scn La scene. + */ + public void setScene(ZScene _scn) { + scene_=_scn; + } + + public void addCatchListener(ZCatchListener _l) { + listeners_.add(_l); + } + + public void removeCatchListener(ZCatchListener _l) { + listeners_.remove(_l); + } + + /** + * Notification des listeners. + * @param _type Le type d'evenement. + * @param _pt Le point d'accrochage. + */ + public void fireCatchEvent(int _type, int _idxGeom, int _idxVertex) { + ZCatchEvent evt=new ZCatchEvent(this,_type,selAccroch_,_idxGeom,_idxVertex); + for (ZCatchListener l : listeners_) { + l.catchChanged(evt); + } + } + + /** + * Gere le SHIFT et le TAB.<p> + * SHIFT : pour inactiver le mode d'accrochage, + * TAB : Pour switcher de point accroch\xE9. + */ + public void keyPressed(KeyEvent e) { + if (e.getKeyCode()==KeyEvent.VK_SHIFT) { + bcatch_=false; + fireCatchEvent(ZCatchEvent.UNCAUGHT,0,0); + } + if (e.getKeyCode()==KeyEvent.VK_N) { + if (selAccroch_.getNbSelectedItem()>1) { + iidxVertex_++; + if (iidxVertex_==idxVertices_.length) { + iidxVertex_=0; + iidxGeom_++; + if (iidxGeom_==idxGeoms_.length) { + iidxGeom_=0; + } + idxVertices_=selAccroch_.getSelection(idxGeoms_[iidxGeom_]).getSelectedIndex(); + } + fireCatchEvent(ZCatchEvent.CAUGHT, idxGeoms_[iidxGeom_],idxVertices_[iidxVertex_]); + } + } + } + + /** + * Gere le SHIFT.<p> + * SHIFT : pour reactiver le mode d'accrochage + */ + public void keyReleased(KeyEvent e) { + if (e.getKeyCode()==KeyEvent.VK_SHIFT) { + bcatch_=true; + iidxVertex_=-1; + iidxGeom_=-1; + mouseMoved(ptTmp_); + } + } + + /** + * Methode inactive. + */ + public void keyTyped(KeyEvent e) {} +} Property changes on: branches/FudaaModeleur_TC1Bis/fudaa_devel/ebli/src/org/fudaa/ebli/calque/ZCalqueCatchInteraction.java ___________________________________________________________________ Added: svn:keywords + Id Added: svn:eol-style + native Modified: branches/FudaaModeleur_TC1Bis/fudaa_devel/ebli/src/org/fudaa/ebli/calque/ZCalqueGeometry.java =================================================================== --- branches/FudaaModeleur_TC1Bis/fudaa_devel/ebli/src/org/fudaa/ebli/calque/ZCalqueGeometry.java 2009-01-23 10:39:23 UTC (rev 4395) +++ branches/FudaaModeleur_TC1Bis/fudaa_devel/ebli/src/org/fudaa/ebli/calque/ZCalqueGeometry.java 2009-01-23 16:12:37 UTC (rev 4396) @@ -198,7 +198,7 @@ if (!isSelectable()) return false; if (isAtomicMode_) { - final EbliListeSelectionMulti l = selectionMulti(_pt, _tolerancePixel); + final EbliListeSelectionMulti l = selectionMulti(_pt, _tolerancePixel, false); changeSelectionMulti(l, _action); if ((l == null) || (l.isEmpty())) { return false; @@ -790,42 +790,44 @@ return r; } - /** - * Renvoie la liste des objets selectionnees pour le point <code>_pt</code> avec pour tolerance - * <code>_tolerance</code>. - * - * @param _pt - * @param _tolerance - * @return la liste des indexs selectionnes (ou null si aucune selection) - */ - public EbliListeSelectionMulti selectionMulti(final GrPoint _pt, final int _tolerance) { + public EbliListeSelectionMulti selectionMulti(final GrPoint _ptReel, final int _tolerancePixel, boolean _inDepth) { final GrMorphisme versReel = getVersReel(); GrBoite bClip = getDomaine(); - if (bClip == null || (!bClip.contientXY(_pt)) && (bClip.distanceXY(_pt) > _tolerance)) { + if (bClip == null || (!bClip.contientXY(_ptReel)) && (bClip.distanceXY(_ptReel) > _tolerancePixel)) { return null; } - final double distanceReel = GrMorphisme.convertDistanceXY(versReel, _tolerance); + final double distanceReel = GrMorphisme.convertDistanceXY(versReel, _tolerancePixel); bClip = getClipReel(getGraphics()); final GrPoint p = new GrPoint(); final GrBoite btLigne = new GrBoite(); + + EbliListeSelectionMulti sel=null; for (int i = modele_.getNombre() - 1; i >= 0; i--) { if (!modele_.isGeometryVisible(i)) continue; modele_.getDomaineForGeometry(i, btLigne); - if (btLigne.contientXY(_pt) || btLigne.distanceXY(_pt) < distanceReel) { + if (btLigne.contientXY(_ptReel) || btLigne.distanceXY(_ptReel) < distanceReel) { for (int j = modele_.getNbPointForGeometry(i) - 1; j >= 0; j--) { modele_.point(p, i, j); - if (bClip.contientXY(p) && (p.distanceXY(_pt) < distanceReel)) { - final EbliListeSelectionMulti r = new EbliListeSelectionMulti(1); - r.set(i, j); - return r; + if (bClip.contientXY(p) && (p.distanceXY(_ptReel) < distanceReel)) { + if (sel==null) + sel = new EbliListeSelectionMulti(1); + sel.add(i, j); + if (!_inDepth) + return sel; } } } } - return null; + return sel; } + /** + * Renvoie sous forme de liste de selection les sommets selectionnes pour la polyligne <code>_poly</code>. + * + * @param _poly Le point pour la selection + * @return la liste des indexs selectionnes (ou null si aucune selection) + */ public EbliListeSelectionMulti selectionMulti(final LinearRing _poly) { if (modele_.getNombre() == 0 || !isVisible()) { return null; Modified: branches/FudaaModeleur_TC1Bis/fudaa_devel/ebli/src/org/fudaa/ebli/calque/ZCalqueLigneBrisee.java =================================================================== --- branches/FudaaModeleur_TC1Bis/fudaa_devel/ebli/src/org/fudaa/ebli/calque/ZCalqueLigneBrisee.java 2009-01-23 10:39:23 UTC (rev 4395) +++ branches/FudaaModeleur_TC1Bis/fudaa_devel/ebli/src/org/fudaa/ebli/calque/ZCalqueLigneBrisee.java 2009-01-23 16:12:37 UTC (rev 4396) @@ -226,7 +226,7 @@ if (!isSelectable()) return false; if (isAtomicMode_) { - final EbliListeSelectionMulti l = selectionMulti(_pt, _tolerancePixel); + final EbliListeSelectionMulti l = selectionMulti(_pt, _tolerancePixel, false); changeSelectionMulti(l, _action); if ((l == null) || (l.isEmpty())) { return false; @@ -875,40 +875,36 @@ return r; } - /** - * Renvoie la liste des objets selectionnees pour le point <code>_pt</code> avec pour tolerance - * <code>_tolerance</code>. - * - * @param _pt - * @param _tolerance - * @return la liste des indexs selectionnes (ou null si aucune selection) - */ - public EbliListeSelectionMulti selectionMulti(final GrPoint _pt, final int _tolerance) { + public EbliListeSelectionMulti selectionMulti(final GrPoint _ptReel, final int _tolerancePixel, boolean _inDepth) { final GrMorphisme versReel = getVersReel(); GrBoite bClip = getDomaine(); - if (bClip == null || (!bClip.contientXY(_pt)) && (bClip.distanceXY(_pt) > _tolerance)) { + if (bClip == null || (!bClip.contientXY(_ptReel)) && (bClip.distanceXY(_ptReel) > _tolerancePixel)) { return null; } - final double distanceReel = GrMorphisme.convertDistanceXY(versReel, _tolerance); + final double distanceReel = GrMorphisme.convertDistanceXY(versReel, _tolerancePixel); bClip = getClipReel(getGraphics()); final GrPoint p = new GrPoint(); final GrBoite btLigne = new GrBoite(); + + EbliListeSelectionMulti sel=null; for (int i = modele_.getNombre() - 1; i >= 0; i--) { if (!modele_.isGeometryVisible(i)) continue; modele_.getDomaineForGeometry(i, btLigne); - if (btLigne.contientXY(_pt) || btLigne.distanceXY(_pt) < distanceReel) { + if (btLigne.contientXY(_ptReel) || btLigne.distanceXY(_ptReel) < distanceReel) { for (int j = modele_.getNbPointForGeometry(i) - 1; j >= 0; j--) { modele_.point(p, i, j); - if (bClip.contientXY(p) && (p.distanceXY(_pt) < distanceReel)) { - final EbliListeSelectionMulti r = new EbliListeSelectionMulti(1); - r.set(i, j); - return r; + if (bClip.contientXY(p) && (p.distanceXY(_ptReel) < distanceReel)) { + if (sel==null) + sel = new EbliListeSelectionMulti(1); + sel.add(i, j); + if (!_inDepth) + return sel; } } } } - return null; + return sel; } public EbliListeSelectionMulti selectionMulti(final LinearRing _poly) { @@ -953,7 +949,7 @@ } return r; } - + /** * D\xE9finit que les modifications d'objets auront lieu en mode atomique. * @param _new true : Modifications en mode atomique. Added: branches/FudaaModeleur_TC1Bis/fudaa_devel/ebli/src/org/fudaa/ebli/calque/ZCatchEvent.java =================================================================== --- branches/FudaaModeleur_TC1Bis/fudaa_devel/ebli/src/org/fudaa/ebli/calque/ZCatchEvent.java (rev 0) +++ branches/FudaaModeleur_TC1Bis/fudaa_devel/ebli/src/org/fudaa/ebli/calque/ZCatchEvent.java 2009-01-23 16:12:37 UTC (rev 4396) @@ -0,0 +1,50 @@ +/* + * @creation 21 janv. 2009 + * @modification $Date:$ + * @license GNU General Public License 2 + * @copyright (c)1998-2009 CETMEF 2 bd Gambetta F-60231 Compiegne + * @mail fud...@li... + */ +package org.fudaa.ebli.calque; + +import java.util.EventObject; + +import org.fudaa.ebli.geometrie.GrPoint; + +/** + * Un evenement envoy\xE9 par le calque d'interaction d'accrochage si un sommet de g\xE9om\xE9trie a \xE9t\xE9 + * accroch\xE9 ou d\xE9ccroch\xE9 {@link ZCalqueCatchInteraction}. + * @author Bertrand Marchand + * @version $Id:$ + */ +public class ZCatchEvent extends EventObject { + /** Le type d'evement pour un accrochage */ + public static int CAUGHT=0; + /** Le type d'evenement pour un d\xE9ccrochage */ + public static int UNCAUGHT=1; + + /** Le type de l'evenement */ + public int type; + /** La liste de selection */ + public ZSceneSelection selection; + /** L'indice de g\xE9ometrie accroch\xE9e */ + public int idxGeom; + /** L'indice de sommet accroch\xE9 */ + public int idxVertex; + + /** + * Construction d'un evenement d'a&ccrochage + * @param _src Le calque ayant d\xE9clench\xE9 cet evenement. + * @param _type Le type de l'evenement + * @param _selection La liste de selection + * @param _idxGeom L'indice de g\xE9ometrie accroch\xE9e + * @param _idxVertex L'indice de sommet accroch\xE9 + */ + public ZCatchEvent(Object _src, int _type, ZSceneSelection _selection, int _idxGeom, int _idxVertex) { + super(_src); + type=_type; + selection=_selection; + idxGeom=_idxGeom; + idxVertex=_idxVertex; + } +} \ No newline at end of file Property changes on: branches/FudaaModeleur_TC1Bis/fudaa_devel/ebli/src/org/fudaa/ebli/calque/ZCatchEvent.java ___________________________________________________________________ Added: svn:keywords + Id Added: svn:eol-style + native Added: branches/FudaaModeleur_TC1Bis/fudaa_devel/ebli/src/org/fudaa/ebli/calque/ZCatchListener.java =================================================================== --- branches/FudaaModeleur_TC1Bis/fudaa_devel/ebli/src/org/fudaa/ebli/calque/ZCatchListener.java (rev 0) +++ branches/FudaaModeleur_TC1Bis/fudaa_devel/ebli/src/org/fudaa/ebli/calque/ZCatchListener.java 2009-01-23 16:12:37 UTC (rev 4396) @@ -0,0 +1,23 @@ +/* + * @creation 21 janv. 2009 + * @modification $Date:$ + * @license GNU General Public License 2 + * @copyright (c)1998-2009 CETMEF 2 bd Gambetta F-60231 Compiegne + * @mail fud...@li... + */ +package org.fudaa.ebli.calque; + +/** + * Une interface qu'un calque d'interaction doit implementer pour gerer l'accrochage sur des + * objets. + * @author Bertrand Marchand + * @version $Id:$ + */ +public interface ZCatchListener { + + /** + * L'accrochage a chang\xE9. Par exemple, le point accroch\xE9 n'est plus le m\xEAme. + * @param _evt L'evenement suite a un accrochage. + */ + public void catchChanged(ZCatchEvent _evt); +} \ No newline at end of file Property changes on: branches/FudaaModeleur_TC1Bis/fudaa_devel/ebli/src/org/fudaa/ebli/calque/ZCatchListener.java ___________________________________________________________________ Added: svn:keywords + Id Added: svn:eol-style + native Modified: branches/FudaaModeleur_TC1Bis/fudaa_devel/ebli/src/org/fudaa/ebli/calque/ZEbliCalquePanelController.java =================================================================== --- branches/FudaaModeleur_TC1Bis/fudaa_devel/ebli/src/org/fudaa/ebli/calque/ZEbliCalquePanelController.java 2009-01-23 10:39:23 UTC (rev 4395) +++ branches/FudaaModeleur_TC1Bis/fudaa_devel/ebli/src/org/fudaa/ebli/calque/ZEbliCalquePanelController.java 2009-01-23 16:12:37 UTC (rev 4396) @@ -8,6 +8,7 @@ package org.fudaa.ebli.calque; import java.awt.Cursor; +import java.awt.Point; import java.awt.event.ActionEvent; import java.awt.event.KeyEvent; import java.beans.PropertyChangeEvent; @@ -39,10 +40,12 @@ import org.fudaa.ebli.commun.EbliActionPaletteSpecAbstract; import org.fudaa.ebli.commun.EbliActionSimple; import org.fudaa.ebli.commun.EbliComponentFactory; +import org.fudaa.ebli.commun.EbliFormatter; import org.fudaa.ebli.commun.EbliFormatterInterface; import org.fudaa.ebli.commun.EbliLib; import org.fudaa.ebli.controle.BConfigurePaletteAction; import org.fudaa.ebli.geometrie.GrBoite; +import org.fudaa.ebli.geometrie.GrPoint; import org.fudaa.ebli.palette.BPaletteInfoAbstractAction; import org.fudaa.ebli.palette.PaletteEditAction; import org.fudaa.ebli.repere.BControleRepereTexte; @@ -127,10 +130,41 @@ } } + class ControllerCatchListener implements ZCatchListener { + public void catchChanged(ZCatchEvent _evt) { + // Si le calque interactif courant n'est pas un calque gerant l'accrochage, on passe. + // TODO : Le calque interactif d'accrochage pourrait n'etre actif que si le calque courant interactif est un calque + // implementant ZCatchListener + if (cqInteractionActif_==null || !(cqInteractionActif_ instanceof ZCatchListener)) return; + + pn_.getVueCalque().setCursor(_evt.type==ZCatchEvent.CAUGHT ? CURSOR_ACC:cqInteractionActif_.getSpecificCursor()); + + if (_evt.type==ZCatchEvent.CAUGHT) { + GrPoint pt=_evt.selection.getScene().getVertex(_evt.idxGeom,_evt.idxVertex); + + String idxGeom=""+(_evt.selection.getScene().sceneId2LayerId(_evt.idxGeom)+1); + String idxVertex=""+(_evt.idxVertex+1); + String cqName=_evt.selection.getScene().getLayerForId(_evt.idxGeom).getTitle(); + String x=getEbliFormatter().getXYFormatter().format(pt.x_); + String y=getEbliFormatter().getXYFormatter().format(pt.y_); + String z=getEbliFormatter().getXYFormatter().format(pt.z_); + + String[] vars={cqName,idxGeom,idxVertex,x,y,z}; + String text= + EbliResource.EBLI.getString("Accroche : Calque={0}, Geom={1}, Sommet={2}, X={3}, Y={4}, Z={5} (n: Suivant)", vars); + pn_.setInfoText(text); + } + else + pn_.unsetInfoText(); + } + + } /** * Identifiant pour les propri\xE9t\xE9s concernant l'\xE9tat d'un calque d'interaction. */ public final static String STATE = "state"; + /** Un curseur specifique pour l'accrochage. */ + public static final Cursor CURSOR_ACC=EbliResource.EBLI.getCursor("curseur_accroche", -1, new Point(1, 1)); protected static EbliActionInterface[] removePaletteAction(final EbliActionInterface[] _i) { if (_i == null) { @@ -157,7 +191,8 @@ protected EbliActionInterface[] standardActionGroup_; ZCalqueSelectionInteractionAbstract cqSelectionI_; - + /** Le calque interactif d'accrochage */ + ZCalqueCatchInteraction cqCatchI_; BPaletteInfoAbstractAction infoPalette_; CalqueInteractionListener interactionListener_; @@ -422,8 +457,8 @@ cqAdmin_.setName("cqADMIN"); cqAdmin_.setTitle(EbliResource.EBLI.getString("Administration")); cqAdmin_.setDestructible(false); + // le calque etl'affichage du suivi des coordonnees. - final BCalqueSuiviSourisInteraction suivi = new BCalqueSuiviSourisInteraction(); suivi.setTitle(EbliResource.EBLI.getString("Position")); suivi.setName("cqPOSITION"); @@ -433,6 +468,18 @@ // setCalqueInteractionExclusif(suivi, false); addCalqueInteraction(suivi); // cqAdmin_.add(suivi); + + // Le calque d'accrochage + // Attention : L'ajout du calque en premier est tr\xE8s important, l'accrochage ne + // fonctionne que si ce calque recoit les evenements MouseEvent en premier lors de la propagation. + cqCatchI_=new ZCalqueCatchInteraction(); + cqCatchI_.setTitle(EbliResource.EBLI.getString("Accrochage")); + cqCatchI_.setName("cqACCROCHAGE"); + cqCatchI_.setDestructible(false); + cqCatchI_.addCatchListener(new ControllerCatchListener()); + pn_.getVueCalque().addKeyListener(cqCatchI_); + addCalqueInteraction(cqCatchI_); + // S\xE9lection cqSelectionI_ = new ZCalqueSelectionInteractionSimple(); // cqSelectionI_ = new ZCalqueSelectionInteractionMulti(); @@ -470,6 +517,10 @@ interactionListener_ = new CalqueInteractionListener(); } _b.addPropertyChangeListener("gele", interactionListener_); + + if (_b instanceof ZCatchListener) { + cqCatchI_.addCatchListener((ZCatchListener)_b); + } } public BCalqueInteraction getCalqueInteraction(String name){ @@ -596,6 +647,10 @@ public final ZCalqueSelectionInteractionAbstract getCqSelectionI() { return cqSelectionI_; } + + public final ZCalqueCatchInteraction getCqCatchI() { + return cqCatchI_; + } public final EbliFormatterInterface getEbliFormatter() { return suiviSouris_.format(); @@ -630,6 +685,10 @@ _b.removePropertyChangeListener("gele", interactionListener_); } cqAdmin_.remove(_b); + + if (_b instanceof ZCatchListener) { + cqCatchI_.removeCatchListener((ZCatchListener)_b); + } } public void restaurer() { Modified: branches/FudaaModeleur_TC1Bis/fudaa_devel/ebli/src/org/fudaa/ebli/calque/ZEbliCalquesPanel.java =================================================================== --- branches/FudaaModeleur_TC1Bis/fudaa_devel/ebli/src/org/fudaa/ebli/calque/ZEbliCalquesPanel.java 2009-01-23 10:39:23 UTC (rev 4395) +++ branches/FudaaModeleur_TC1Bis/fudaa_devel/ebli/src/org/fudaa/ebli/calque/ZEbliCalquesPanel.java 2009-01-23 16:12:37 UTC (rev 4396) @@ -399,6 +399,7 @@ gisEditor_=createGisEditor(); controller_.getCqSelectionI().setEditor(gisEditor_); + controller_.getCqCatchI().setScene(scene_); } protected ZEditorDefault createGisEditor() { Modified: branches/FudaaModeleur_TC1Bis/fudaa_devel/ebli/src/org/fudaa/ebli/calque/ZModeleDonnees.java =================================================================== --- branches/FudaaModeleur_TC1Bis/fudaa_devel/ebli/src/org/fudaa/ebli/calque/ZModeleDonnees.java 2009-01-23 10:39:23 UTC (rev 4395) +++ branches/FudaaModeleur_TC1Bis/fudaa_devel/ebli/src/org/fudaa/ebli/calque/ZModeleDonnees.java 2009-01-23 16:12:37 UTC (rev 4396) @@ -9,6 +9,7 @@ package org.fudaa.ebli.calque; import org.fudaa.ebli.geometrie.GrBoite; +import org.fudaa.ebli.geometrie.GrPoint; import com.memoire.bu.BuTable; @@ -56,4 +57,12 @@ */ Object getObject(int _ind); + /** + * Retourne le sommet 3D d'indice _idVertex pour l'objet d'index _ind. + * @param _ind L'indice de l'objet. + * @param _idVertex L'indice du sommet. + * @return Le point, ou null en cas de non conformit\xE9. + */ + GrPoint getVertexForObject(int _ind, int _idVertex); + } \ No newline at end of file Modified: branches/FudaaModeleur_TC1Bis/fudaa_devel/ebli/src/org/fudaa/ebli/calque/ZModeleDonneesVide.java =================================================================== --- branches/FudaaModeleur_TC1Bis/fudaa_devel/ebli/src/org/fudaa/ebli/calque/ZModeleDonneesVide.java 2009-01-23 10:39:23 UTC (rev 4395) +++ branches/FudaaModeleur_TC1Bis/fudaa_devel/ebli/src/org/fudaa/ebli/calque/ZModeleDonneesVide.java 2009-01-23 16:12:37 UTC (rev 4396) @@ -8,13 +8,14 @@ package org.fudaa.ebli.calque; import org.fudaa.ebli.geometrie.GrBoite; +import org.fudaa.ebli.geometrie.GrPoint; import org.fudaa.ebli.palette.BPaletteInfo.InfoData; import com.memoire.bu.BuTable; /** * @author Fred Deniger - * @version $Id: ZModeleDonneesVide.java,v 1.7 2006-07-13 13:35:44 deniger Exp $ + * @version $Id$ */ public class ZModeleDonneesVide implements ZModeleDonnees { @@ -47,5 +48,9 @@ public Object getObject(final int _ind){ return null; } + + public GrPoint getVertexForObject(int _ind, int vertex) { + return null; + } } Property changes on: branches/FudaaModeleur_TC1Bis/fudaa_devel/ebli/src/org/fudaa/ebli/calque/ZModeleDonneesVide.java ___________________________________________________________________ Added: svn:keywords + Id Modified: branches/FudaaModeleur_TC1Bis/fudaa_devel/ebli/src/org/fudaa/ebli/calque/ZModeleDonnesAbstract.java =================================================================== --- branches/FudaaModeleur_TC1Bis/fudaa_devel/ebli/src/org/fudaa/ebli/calque/ZModeleDonnesAbstract.java 2009-01-23 10:39:23 UTC (rev 4395) +++ branches/FudaaModeleur_TC1Bis/fudaa_devel/ebli/src/org/fudaa/ebli/calque/ZModeleDonnesAbstract.java 2009-01-23 16:12:37 UTC (rev 4396) @@ -11,6 +11,7 @@ import java.util.ArrayList; import java.util.List; +import org.fudaa.ebli.geometrie.GrPoint; import org.fudaa.ebli.palette.BPaletteInfo.InfoData; import com.memoire.bu.BuTable; @@ -20,7 +21,7 @@ /** * @author deniger - * @version $Id: ZModeleDonnesAbstract.java,v 1.10 2006-09-19 14:55:46 deniger Exp $ + * @version $Id$ */ public abstract class ZModeleDonnesAbstract implements ZModeleDonnees { @@ -29,6 +30,10 @@ return null; } + public GrPoint getVertexForObject(int _ind, int _idVertex) { + return null; + } + public BuTable createValuesTable(final ZCalqueAffichageDonneesInterface _layer) { return null; } Property changes on: branches/FudaaModeleur_TC1Bis/fudaa_devel/ebli/src/org/fudaa/ebli/calque/ZModeleDonnesAbstract.java ___________________________________________________________________ Added: svn:keywords + Id Modified: branches/FudaaModeleur_TC1Bis/fudaa_devel/ebli/src/org/fudaa/ebli/calque/ZModeleFlecheForGrille.java =================================================================== --- branches/FudaaModeleur_TC1Bis/fudaa_devel/ebli/src/org/fudaa/ebli/calque/ZModeleFlecheForGrille.java 2009-01-23 10:39:23 UTC (rev 4395) +++ branches/FudaaModeleur_TC1Bis/fudaa_devel/ebli/src/org/fudaa/ebli/calque/ZModeleFlecheForGrille.java 2009-01-23 16:12:37 UTC (rev 4396) @@ -20,7 +20,7 @@ * Une classe permettant de cr\xE9er un modele de fleches d'apr\xE8s la grille utilis\xE9 sur une autre modele. * * @author fred deniger - * @version $Id: ZModeleFlecheForGrille.java,v 1.2 2007-06-20 12:23:11 deniger Exp $ + * @version $Id$ */ public class ZModeleFlecheForGrille implements ZModeleFleche { @@ -148,4 +148,8 @@ return lastRes_; } + public GrPoint getVertexForObject(int _ind, int vertex) { + return null; + } + } Property changes on: branches/FudaaModeleur_TC1Bis/fudaa_devel/ebli/src/org/fudaa/ebli/calque/ZModeleFlecheForGrille.java ___________________________________________________________________ Added: svn:keywords + Id Modified: branches/FudaaModeleur_TC1Bis/fudaa_devel/ebli/src/org/fudaa/ebli/calque/ZModeleGeometry.java =================================================================== --- branches/FudaaModeleur_TC1Bis/fudaa_devel/ebli/src/org/fudaa/ebli/calque/ZModeleGeometry.java 2009-01-23 10:39:23 UTC (rev 4395) +++ branches/FudaaModeleur_TC1Bis/fudaa_devel/ebli/src/org/fudaa/ebli/calque/ZModeleGeometry.java 2009-01-23 16:12:37 UTC (rev 4396) @@ -48,7 +48,7 @@ void getDomaineForGeometry(int _idxGeom, GrBoite _target); /** - * Modifie les coordonn\xE9es du sommet _pt pour correspondre au point d'indice _pointIdx de la + * Modifie les coordonn\xE9es X,Y,Z du sommet _pt pour correspondre au point d'indice _pointIdx de la * g\xE9om\xE9trie. * * @param _pt le point a modifier Modified: branches/FudaaModeleur_TC1Bis/fudaa_devel/ebli/src/org/fudaa/ebli/calque/ZModeleStatiquePoint.java =================================================================== --- branches/FudaaModeleur_TC1Bis/fudaa_devel/ebli/src/org/fudaa/ebli/calque/ZModeleStatiquePoint.java 2009-01-23 10:39:23 UTC (rev 4395) +++ branches/FudaaModeleur_TC1Bis/fudaa_devel/ebli/src/org/fudaa/ebli/calque/ZModeleStatiquePoint.java 2009-01-23 16:12:37 UTC (rev 4396) @@ -16,7 +16,7 @@ /** * Le modele du calque d'affichage de point. * - * @version $Id: ZModeleStatiquePoint.java,v 1.10 2006-09-19 14:55:48 deniger Exp $ + * @version $Id$ * @author Guillaume Desnoix */ public class ZModeleStatiquePoint extends ZModeleDonnesAbstract implements ZModelePoint { @@ -151,4 +151,8 @@ return point(_i); } // public final boolean contourSelectionnable(int _i) { return true; } + + public GrPoint getVertexForObject(int _ind, int vertex) { + return point(_ind); + } } Property changes on: branches/FudaaModeleur_TC1Bis/fudaa_devel/ebli/src/org/fudaa/ebli/calque/ZModeleStatiquePoint.java ___________________________________________________________________ Added: svn:keywords + Id Modified: branches/FudaaModeleur_TC1Bis/fudaa_devel/ebli/src/org/fudaa/ebli/calque/ZScene.java =================================================================== --- branches/FudaaModeleur_TC1Bis/fudaa_devel/ebli/src/org/fudaa/ebli/calque/ZScene.java 2009-01-23 10:39:23 UTC (rev 4395) +++ branches/FudaaModeleur_TC1Bis/fudaa_devel/ebli/src/org/fudaa/ebli/calque/ZScene.java 2009-01-23 16:12:37 UTC (rev 4396) @@ -12,6 +12,7 @@ import java.awt.Graphics2D; import java.beans.PropertyChangeListener; +import java.lang.ref.WeakReference; import java.util.ArrayList; import java.util.Arrays; import java.util.HashSet; @@ -23,6 +24,7 @@ import org.fudaa.ctulu.CtuluListSelectionInterface; import org.fudaa.ebli.calque.edition.ZCalqueEditable; import org.fudaa.ebli.commun.EbliActionInterface; +import org.fudaa.ebli.commun.EbliListeSelectionMulti; import org.fudaa.ebli.commun.EbliListeSelectionMultiInterface; import org.fudaa.ebli.commun.EbliSelectionState; import org.fudaa.ebli.geometrie.GrBoite; @@ -344,6 +346,8 @@ protected SceneListSelectionMulti selectionMulti_=null; protected SceneSelectionHelper selectionHelper_=null; protected boolean atomicMode_=false; + /** La selection pour l'accrochage. Conserv\xE9e pour ne pas etre reconstruite a chaque appel. */ + protected ZSceneSelection selTmp_=new ZSceneSelection(this); /** La scene est r\xE9duite au calque s\xE9lectionn\xE9 pour toutes les actions. */ protected boolean layerRestricted_=false; @@ -523,6 +527,36 @@ fireSelectionEvent(); return b; } + + /** + * Retourne la selection pour le point donn\xE9.<p> + * <b>Remarque:</b> Uniquement des sommets pour le moment, et en tenant compte du fait que la selection + * est restreinte a un calque ou pas. + * + * @param _pt Le point donn\xE9. + * @param _tolerance La tol\xE9rance, en pixels. + * @return Les sommets selectionn\xE9s, ou vide si aucune selection. + */ + public ZSceneSelection selection(final GrPoint _pt, final int _tolerance) { + selTmp_.clear(); + for (ZCalqueAffichageDonneesInterface cq : getTargetLayers()) { + EbliListeSelectionMulti sel=(EbliListeSelectionMulti)cq.selectionMulti(_pt, _tolerance, true); + if (sel!=null) + selTmp_.addLayerListSelectionMulti(cq,sel); + } + return selTmp_; + } + + /** + * Retourne le sommet 3D correspondant a l'indice de geometrie _idScene et l'indice de sommet _idVertex. + * @param _idScene L'indice de la g\xE9om\xE9trie dans la scene + * @param _idVertex L'indice de sommet sur la g\xE9om\xE9trie. + * @return Le sommet 3D. + */ + public GrPoint getVertex(int _idScene, int _idVertex) { + int idxGeom=sceneId2LayerId(_idScene); + return getLayerForId(_idScene).modeleDonnees().getVertexForObject(idxGeom, _idVertex); + } /** * @return la ligne repr\xE9sentant la s\xE9lection courant. null si s\xE9lection non adequate @@ -757,7 +791,7 @@ * si restreint et non calque de donn\xE9es. * @return Les calques cibles. */ - private ZCalqueAffichageDonneesInterface[] getTargetLayers() { + public ZCalqueAffichageDonneesInterface[] getTargetLayers() { if (!isRestrictedToCalqueActif()) return getAllLayers(); else if (treeModel_.getSelectedCalque() instanceof ZCalqueAffichageDonneesInterface) @@ -766,6 +800,10 @@ return new ZCalqueAffichageDonneesInterface[0]; } + /** + * Retourne tous les calques de donn\xE9es contenues dans la scene, dans l'ordre de parcours de l'arbre des calques. + * @return Les calques de donn\xE9es. + */ public ZCalqueAffichageDonneesInterface[] getAllLayers() { if (brefreshRequested_) { ArrayList<BCalque> lcqs=new ArrayList<BCalque>(); Added: branches/FudaaModeleur_TC1Bis/fudaa_devel/ebli/src/org/fudaa/ebli/calque/ZSceneSelection.java =================================================================== --- branches/FudaaModeleur_TC1Bis/fudaa_devel/ebli/src/org/fudaa/ebli/calque/ZSceneSelection.java (rev 0) +++ branches/FudaaModeleur_TC1Bis/fudaa_devel/ebli/src/org/fudaa/ebli/calque/ZSceneSelection.java 2009-01-23 16:12:37 UTC (rev 4396) @@ -0,0 +1,75 @@ +/* + * @creation 15 janv. 2009 + * @modification $Date:$ + * @license GNU General Public License 2 + * @copyright (c)1998-2009 CETMEF 2 bd Gambetta F-60231 Compiegne + * @mail fud...@li... + */ +package org.fudaa.ebli.calque; + +import org.fudaa.ctulu.CtuluListSelection; +import org.fudaa.ctulu.CtuluListSelectionInterface; +import org.fudaa.ebli.commun.EbliListeSelectionMulti; +import org.fudaa.ebli.commun.EbliListeSelectionMultiInterface; + +/** + * Une selection pour des g\xE9om\xE9tries ou des sommets de la scene. La selection contient des indices globaux de g\xE9om\xE9tries. + * En cas de selection en mode g\xE9om\xE9tries, la liste des sommets pour un index de g\xE9om\xE9trie est vide. + * + * @author Bertrand Marchand + * @version $Id:$ + */ +public class ZSceneSelection extends EbliListeSelectionMulti { + ZScene scn_; + + /** + * Cr\xE9ation de la liste. + * @param _scn La scene. + */ + public ZSceneSelection(ZScene _scn) { + super(0); + scn_=_scn; + } + + /** + * Ajoute la selection de g\xE9om\xE9tries d'un calque donn\xE9. + * @param _cq Le calque contenant la liste de selection. + * @param _sel La liste des indices de g\xE9om\xE9tries pour le calque. + */ + public void addLayerListSelection(ZCalqueAffichageDonneesInterface _cq, CtuluListSelectionInterface _sel) { + int idecal=0; + for (ZCalqueAffichageDonneesInterface cq : scn_.getTargetLayers()) { + if (cq==_cq) break; + idecal+=cq.modeleDonnees().getNombre(); + } + + for (int idx=_sel.getMinIndex(); idx<=_sel.getMaxIndex(); idx++) { + // Ajoute une liste de selection des sommets vide. + if (_sel.isSelected(idx)) + set(idx+idecal,new CtuluListSelection(0)); + } + } + + /** + * Ajoute la selection de vertex d'un calque donn\xE9. + * @param _cq Le calque contenant la liste de selection. + * @param _sel La liste des indices de sommets par g\xE9om\xE9trie pour le calque. + */ + public void addLayerListSelectionMulti(ZCalqueAffichageDonneesInterface _cq, EbliListeSelectionMultiInterface _sel) { + int idecal=0; + for (ZCalqueAffichageDonneesInterface cq : scn_.getTargetLayers()) { + if (cq==_cq) break; + idecal+=cq.modeleDonnees().getNombre(); + } + + CtuluListSelection selGeom=_sel.getIdxSelection(); + for (int idx=selGeom.getMinIndex(); idx<=selGeom.getMaxIndex(); idx++) { + if (selGeom.isSelected(idx)) + set(idx+idecal,(CtuluListSelection)_sel.getSelection(idx)); + } + } + + public ZScene getScene() { + return scn_; + } +} Property changes on: branches/FudaaModeleur_TC1Bis/fudaa_devel/ebli/src/org/fudaa/ebli/calque/ZSceneSelection.java ___________________________________________________________________ Added: svn:keywords + Id Added: svn:eol-style + native Modified: branches/FudaaModeleur_TC1Bis/fudaa_devel/ebli/src/org/fudaa/ebli/calque/edition/ZCalqueDistanceInteraction.java =================================================================== --- branches/FudaaModeleur_TC1Bis/fudaa_devel/ebli/src/org/fudaa/ebli/calque/edition/ZCalqueDistanceInteraction.java 2009-01-23 10:39:23 UTC (rev 4395) +++ branches/FudaaModeleur_TC1Bis/fudaa_devel/ebli/src/org/fudaa/ebli/calque/edition/ZCalqueDistanceInteraction.java 2009-01-23 16:12:37 UTC (rev 4396) @@ -21,6 +21,11 @@ import java.util.List; import org.fudaa.ebli.calque.BCalqueInteraction; +import org.fudaa.ebli.calque.ZCatchEvent; +import org.fudaa.ebli.calque.ZCatchListener; +import org.fudaa.ebli.calque.ZEbliCalquePanelController; +import org.fudaa.ebli.calque.ZEbliCalquesPanel; +import org.fudaa.ebli.calque.ZScene; import org.fudaa.ebli.geometrie.GrPoint; import org.fudaa.ebli.ressource.EbliResource; import org.fudaa.ebli.trace.TraceLigne; @@ -34,8 +39,9 @@ * @author Emmanuel MARTIN * @version $Id$ */ -public class ZCalqueDistanceInteraction extends BCalqueInteraction implements MouseListener, MouseMotionListener { - +public class ZCalqueDistanceInteraction extends BCalqueInteraction implements MouseListener, MouseMotionListener, ZCatchListener { + private static final Cursor CURSOR_DST_=EbliResource.EBLI.getCursor("curseur_distance", -1, new Point(6, 6)); + /** Liste des points composant le chemin affich\xE9. Se sont des coordonn\xE9s r\xE9els. */ protected List<Coordinate> chemin_=new ArrayList<Coordinate>(); /** La coordonn\xE9e correspondant \xE0 la position de la souris. C'est une coordonn\xE9s \xE9cran. */ @@ -52,6 +58,8 @@ protected boolean ctrlActif_=false; /** Listener des distances. */ private List<PropertyChangeListener> listeners_=new ArrayList<PropertyChangeListener>(); + /** Point d'accrochage si existant. null si la souris n'est pas sur un point d'accorchage */ + private GrPoint ptAccroch_=null; public ZCalqueDistanceInteraction(){ setName("cqInteractifDistance"); @@ -84,7 +92,7 @@ // M\xE9thodes d\xE9riv\xE9es \\ public Cursor getSpecificCursor() { - return EbliResource.EBLI.getCursor("curseur_distance", -1, new Point(6, 6)); + return CURSOR_DST_; } public boolean alwaysPaint() { @@ -192,8 +200,7 @@ traceLigne_.dessineTrait((Graphics2D) getGraphics(), reelToEcran(chemin_.get(i-1)).x, reelToEcran(chemin_.get(i-1)).y, reelToEcran(chemin_.get(i)).x, reelToEcran(chemin_.get(i)).y); } - public void mousePressed(final MouseEvent _evt) { - } + public void mousePressed(final MouseEvent _evt) {} public void mouseDragged(final MouseEvent _evt) { mouseMoved(_evt); @@ -205,7 +212,9 @@ /** Met \xE0 jour la partie variable du chemin. */ public void mouseMoved(final MouseEvent _evt) { - if(!isGele()&&!cheminComplet_){ + if(isGele()) return; + + if (!cheminComplet_){ effaceVariable(); coordSouris_.x=_evt.getX(); coordSouris_.y=_evt.getY(); @@ -216,21 +225,40 @@ public void mouseReleased(final MouseEvent _evt) { if (!isGele()&&_evt.getButton()==MouseEvent.BUTTON1) { + GrPoint pt=new GrPoint(_evt.getX(),_evt.getY(),0); + + if (ptAccroch_!=null) + pt=ptAccroch_.applique(getVersEcran()); + effaceChemin(); effaceVariable(); - coordSouris_.x=_evt.getX(); - coordSouris_.y=_evt.getY(); + coordSouris_.x=pt.x_; + coordSouris_.y=pt.y_; // Si le chemin \xE9tait d\xE9j\xE0 complet, on reprend \xE0 0 if(cheminComplet_){ chemin_.clear(); cheminComplet_=false; repaint(); } - chemin_.add(ecranToReel(new Coordinate(_evt.getX(), _evt.getY()))); + chemin_.add(ecranToReel(new Coordinate(pt.x_,pt.y_))); // Si c'est le dernier point, le chemin est termin\xE9 cheminComplet_=chemin_.size()>1&&getDistanceCumulee()>0&&(_evt.getClickCount()>=2||_evt.isControlDown()); afficheChemin(); fireDistanceChangeListener(); } } + + /* (non-Javadoc) + * @see org.fudaa.ebli.calque.ZCalqueCatchInteraction.ZCatchListener#catchChanged(org.fudaa.ebli.calque.ZCalqueCatchInteraction.ZCatchEvent) + */ + public void catchChanged(ZCatchEvent _evt) { + if (isGele()) return; + + if (_evt.type==ZCatchEvent.CAUGHT) { + ptAccroch_=_evt.selection.getScene().getVertex(_evt.idxGeom,_evt.idxVertex); + } + else { + ptAccroch_=null; + } + } } Modified: branches/FudaaModeleur_TC1Bis/fudaa_devel/ebli/src/org/fudaa/ebli/calque/edition/ZCalqueEditionInteraction.java =================================================================== --- branches/FudaaModeleur_TC1Bis/fudaa_devel/ebli/src/org/fudaa/ebli/calque/edition/ZCalqueEditionInteraction.java 2009-01-23 10:39:23 UTC (rev 4395) +++ branches/FudaaModeleur_TC1Bis/fudaa_devel/ebli/src/org/fudaa/ebli/calque/edition/ZCalqueEditionInteraction.java 2009-01-23 16:12:37 UTC (rev 4396) @@ -19,7 +19,6 @@ import java.awt.event.MouseMotionListener; import java.util.ArrayList; import java.util.HashMap; -import java.util.Set; import java.util.Vector; import java.util.Map.Entry; @@ -30,6 +29,10 @@ import org.fudaa.ctulu.CtuluLibString; import org.fudaa.ctulu.gis.GISAttributeInterface; import org.fudaa.ebli.calque.BCalqueInteraction; +import org.fudaa.ebli.calque.BVueCalque; +import org.fudaa.ebli.calque.ZCatchEvent; +import org.fudaa.ebli.calque.ZCatchListener; +import org.fudaa.ebli.calque.ZScene; import org.fudaa.ebli.calque.dessin.DeForme; import org.fudaa.ebli.calque.dessin.DeLigneBrisee; import org.fudaa.ebli.calque.dessin.DeMultiPoint; @@ -47,19 +50,21 @@ /** * Permet la saisie interactive de formes g\xE9om\xE9triques. - * @version $Id: ZCalqueEditionInteraction.java,v 1.16.6.2 2008-03-27 15:26:27 bmarchan Exp $ + * @version $Id$ * @author */ -public class ZCalqueEditionInteraction extends BCalqueInteraction implements KeyListener, MouseListener, MouseMotionListener { +public class ZCalqueEditionInteraction extends BCalqueInteraction implements KeyListener, MouseListener, MouseMotionListener, ZCatchListener { /** * La classe deleguee pour la saisie de forme. * * @author Fred Deniger - * @version $Id: ZCalqueEditionInteraction.java,v 1.16.6.2 2008-03-27 15:26:27 bmarchan Exp $ + * @version $Id$ */ public abstract class FormDelegate extends MouseAdapter implements KeyListener, MouseMotionListener { + /** LE dernier point d'accrochage definit */ + GrPoint ptAccro_=null; /** * Enleve le dernier point saisie. */ @@ -126,6 +131,10 @@ * @see java.awt.event.KeyListener#keyTyped(java.awt.event.KeyEvent) */ public void keyTyped(KeyEvent _e) {} + + public void setAccroche(GrPoint _ptReel) { + ptAccro_=_ptReel; + } } class FormDelegateLigneBrisee extends FormDelegate { @@ -174,6 +183,7 @@ g2d.setXORMode(getBackground()); ligne_.affiche(g2d, tl_, isRapide(), tmp_, getVersEcran()); ligne_.enleveDernier(); + data_.removeLastInfo(); if (pointFin_ != null) { pointFin_ = ligne_.getDernier(); } @@ -302,12 +312,16 @@ tmp_.x_ = _x; tmp_.y_ = _y; tmp_.autoApplique(getVersReel()); - support_.setMessage(CtuluLib.getS("Distance:") - + CtuluLibString.ESPACE - + CtuluLib.DEFAULT_NUMBER_FORMAT.format(CtuluLibGeometrie.getDistance(tmp_.x_, tmp_.y_, pointFin_.x_, - pointFin_.y_))); + + if (ptAccro_==null) { + support_.setMessage(CtuluLib.getS("Distance:") + + CtuluLibString.ESPACE + + CtuluLib.DEFAULT_NUMBER_FORMAT.format(CtuluLibGeometrie.getDistance(tmp_.x_, tmp_.y_, pointFin_.x_, + pointFin_.y_))); + } } else { - support_.unsetMessage(); + if (ptAccro_==null) + support_.unsetMessage(); } } @@ -325,11 +339,15 @@ } else { data_ = features_.createLigneBriseeData(); } - pointDep_ = getPointReel(_e); + if (ptAccro_==null) + pointDep_ = getPointReel(_e); + else + pointDep_=ptAccro_; + pointFin_ = pointDep_; ligne_.ajoute(pointDep_); if (data_ != null) { - data_.addPoint(); + data_.addPoint(ptAccro_); } if (support_ != null) { @@ -340,10 +358,13 @@ else { boolean afficheLigne = true; if (_e.getClickCount() < 2) { - pointFin_ = getPointReel(_e); + if (ptAccro_==null) + pointFin_ = getPointReel(_e); + else + pointFin_=ptAccro_; ligne_.ajoute(pointFin_); if (data_ != null) { - data_.addPoint(); + data_.addPoint(ptAccro_); } if (_e.isControlDown()) { afficheLigne = polyAdded(); @@ -392,6 +413,7 @@ } else { multipoint_.enleveDernier(); + data_.removeLastInfo(); multipoint_.affiche(g2d, tp_, isRapide(), tmp_, getVersEcran()); support_.atomicChanged(); @@ -467,10 +489,10 @@ } boolean afficheLigne=true; if (_e.getClickCount()<2) { - GrPoint pt=getPointReel(_e); + GrPoint pt=ptAccro_==null ? getPointReel(_e):ptAccro_; multipoint_.ajoute(pt); if (data_!=null) { - data_.addPoint(); + data_.addPoint(ptAccro_); } if (_e.isControlDown()) { afficheLigne=polyAdded(); @@ -532,7 +554,8 @@ if (pt_==null) return; final ZEditionAttributesDataI d = features_ == null ? null : features_.createPointData(); if (d != null) { - d.addPoint(); + if (ptAccro_!=null) pt_=ptAccro_; + d.addPoint(ptAccro_); support_.addNewPoint(pt_, d); } pt_=null; @@ -630,6 +653,8 @@ public void mousePressed(final MouseEvent _e) { if (origine_==null) { origine_=getPointReel(_e); + if (ptAccro_!=null) + origine_=ptAccro_; if (support_!=null) support_.atomicChanged(); moved_=false; @@ -640,8 +665,12 @@ if (enCours()) { moved_=true; effaceDessin(); - grandRayon_=Math.abs(getPointReel(_e).x_-origine_.x_); - petitRayon_=Math.abs(getPointReel(_e).y_-origine_.y_); + GrPoint pt=getPointReel(_e); + if (ptAccro_!=null) + pt=ptAccro_; + + 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((Object)KeyEvent.VK_CONTROL)) { grandRayon_ = (grandRayon_ + petitRayon_)/2; @@ -743,7 +772,7 @@ } for (double t=0; t<2*Math.PI; t+=incT) { poly.sommets_.ajoute(getXEllipse(t)+origine_.x_, getYEllipse(t)+origine_.y_, 0); - if(_withData) data_.addPoint(); + if(_withData) data_.addPoint(null); } // Mise a jour des attributs if(_withData) addData(); @@ -1035,6 +1064,8 @@ public void mousePressed(final MouseEvent _e) { if (pointDep_ == null) { pointDep_ = getPointReel(_e); + if (ptAccro_!=null) + pointDep_=ptAccro_; if (support_ != null) support_.atomicChanged(); moved_ = false; @@ -1046,6 +1077,8 @@ effaceDessin(); moved_=true; pointFin_=getPointReel(_e); + if (ptAccro_!=null) + pointFin_=ptAccro_; // Si la touche Ctrl est pressee, on est en mode 'carre' if (keyPresse_.contains((Object)KeyEvent.VK_CONTROL)) { double cote=(Math.abs(pointDep_.x_-pointFin_.x_)+Math.abs(pointDep_.y_-pointFin_.y_))/2; @@ -1143,28 +1176,28 @@ double largeur = Math.abs(x1 - x0), hauteur = Math.abs(y1 - y0); // Ajout des sommets dans le bonne ordre poly.sommets_.ajoute(x0, y0, z0); - if(_withData) data_.addPoint(); + if(_withData) data_.addPoint(null); for (int i=0; i<nbPointsHauteur_; i++){ poly.sommets_.ajoute(x0, y0 + (i + 1) * (hauteur / (nbPointsHauteur_ + 1)), z0); - if(_withData) data_.addPoint(); + if(_withData) data_.addPoint(null); } poly.sommets_.ajoute(x0, y1, z0); - if(_withData) data_.addPoint(); + if(_withData) data_.addPoint(null); ... [truncated message content] |