Bonne idée :)
N'hésitez pas à poster des images du résultat lorsque vous aurez terminé. Ceci afin d'aider à visualiser ce que ça donne pour les personne qui passeront sur le sujet.
Version imprimable
Bonne idée :)
N'hésitez pas à poster des images du résultat lorsque vous aurez terminé. Ceci afin d'aider à visualiser ce que ça donne pour les personne qui passeront sur le sujet.
Vmolines
Bien entendu.
Cela va de soit, vu que les progrès que je fait, le sont grâce à vous, les membres experts, il me semble important que tous puissent comprendre non seulement le problème mais également la ou les solutions qui permettent leurs résolutions.
Et puis, où serait le plaisir sinon......
Vmolines,
Là j'avoue "sécher" un peut.
Lorsque l'ont regarde le code suivant:
1- Je comprend bien comment est crée le rectangle ayant les coordonnées X1,Y1 et X2,Y2. (d'ailleurs, j'ai joins le premier exemple réalisé)Code:
1
2
3
4
5
6
7
8 //CONSTRUCTION DE L'IMAGE oPlan est un CPlan(IMG_Image1..Nom) ... oPlan:AjouterZonePlanRectangle(allouer un CZonePlanRectangle(allouer un CPoint(55,70),allouer un CPoint(115,130), "R-CLI-EXPED")) ... ... oPlan:Dessiner()
2- Je comprend également tout à fait l'idée de la création d'un bouton "Nouvelle zone".
3- Là ou je bloque, c'est comment créer les autres rectangles, pourquoi:
a) Comme vous pouvez le voir dans l'exemple joint, je possède une table dans laquelle se trouve toutes les coordonnées de l'ensemble des 237 zones de mon plan.
b) Je pensais pouvoir interroger la base sql comme dans l'exemple, et passer les paramètres en variables afin que l'ensemble des rectangle soient crées.
Alors, si je décompose votre méthode:
1- Sans commentaireCode:
1
2
3
4
5 1- Appuie sur un bouton "Créer une zone" 2- Capter deux clics sur l'image avec les coordonnées 3- Demander de saisir les autres informations définissant une zone (libellé, etc...) 4- Enregistrer tout ça dans une nouvelle ligne de la table Zone 5- Rappeler le code d'affichage du plan
2- J'avoue ne pas y arriver
3- Soit par une fenêtre avec champ de saisie avec un code du type:
Mais que faire de ces paramètresCode:
1
2
3
4
5
6
7
8
9
10 SAI_CPoint1 est une chaîne SAI_CPoint2 est une chaîne SAI_NOMZONE est une chaîne valeur est une chaîne Valeur=Ouvre(Paramètres) SAI_CPoint1=ExtraitChaîne(Valeur,1,"//") SAI_CPoint2=ExtraitChaîne(Valeur,2,"//") SAI_NOMZONE =ExtraitChaîne(Valeur,3,"//")
4- Soit par l'interrogation de la base sql, mais là aussi, je n'arrive pas à me visualiser la chose.
Avec une requête du type:
5- Là, je pense avoir bon avec le code de déclaration du projet, sauf que j'imagine devoir lui passer chacun des paramètres récupérés.Code:
1
2
3
4
5
6
7 sRequetePLZ est une chaîne sRequetePLZ="SELECT PLZ_AFFECTATION,PLZ_X1O,PLZ_Y1O,PLZ_X2O,PLZ_Y2O FROM PLANS_ZONES " SI EnModeTest() ALORS Trace(sRequetePLZ) SI SQLExec(sRequetePLZ,"ReqPLZ") ALORS SQLTable("ReqPLZ",TABLE_PLZ) FIN
Ma synthèse est que j'ai l'impression de comprendre ce qu'il faut faire, mais ne pas savoir comment le faire
Mille merci pour votre aide
Prenons les problèmes séparément.
1) Afficher un plan des zones présentes en BDD
Dans :
Il faut procéder à un parcours de votre fichier et pour chaque ligne appeler AjouterZonePlanRectangle. Contrairement au code de test, les valeurs ne sont plus en dur mais issues de vos données. Imaginons que votre table s'appelle FICZone avec les rubriques "libelle" et "x1", "y1", "x2", "y2" pour les coordonnées :Code:
1
2
3
4
5
6 oPlan est un CPlan(IMG_Image1..Nom) oPlan:AjouterZonePlanRectangle(allouer un CZonePlanRectangle(allouer un CPoint(55,70),allouer un CPoint(115,130), "R-CLI-EXPED")) ... ... oPlan:Dessiner()
Le chargement à partir de vos données est fait.Code:
1
2
3
4
5
6
7 oPlan est un CPlan(IMG_Image1..Nom) POUR TOUT FICZone oPlan:AjouterZonePlanRectangle(allouer un CZonePlanRectangle(allouer un CPoint(FICZone.x1, FICZone.y1),allouer un CPoint(FICZone.x2,FICZone.x2), FICZone.Libelle)) FIN oPlan:Dessiner()
2) Pour la création d'une nouvelle zone
Récupérer les clics se fait simplement en mettant dans le code de clic de l'image. De là vous pouvez lire SourisPosX() et SourisPosY().
Tout ce que vous avez à faire c'est écrire dans FICZone les valeurs lues :
Puis rappeler le code d'affichage du plan qui relira la base de données avec la nouvelle ligne donc la nouvelle zone.Code:
1
2
3
4
5
6
7 FICZone.x1 = ... FICZone.y1 = ... FICZone.x2 = ... FICZone.y2 = ... FICZone.Libelle = ... HAjouteEnregistrement(FICZone)
Je vous laisse le soin de traiter le code de clic de l'image en fonction du mode dans lequel vous êtes "Création de zone" ou "Consultation". En mode Création, vous devez capter 2 clics puis créer l'enregistrement dans FICZone. Il faudra savoir si vous avez déjà cliqué sur l'image pour le point haut gauche en l'ayant mémorisé. La deuxième fois vous effectuez l'ajout. Pour traiter ça, vous devrez passer par des variables globales de fenêtre.
En conclusion, la première tâche effectue :
BDD -> Champ image
la deuxième
Champ image -> BDD
Vmolines,
Il m'a fallu un temps de compréhension entre vos propos et sa mise en œuvre.
1) Afficher un plan des zones présentes en BDD
Ce point est maintenant résolu, à un détail prêt
a) L'ensemble des rectangle s'affichent correctement
b) Les infos lors d'un clic sur une zone s'affichent correctement.
Avec le code suivant:
Lors du test, je me suis aperçu que l'image n'est plus adaptée à l'échelle.Code:
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17 //CONSTRUCTION DE L'IMAGE oPlan est un CPlan(IMG_Image1..Nom) //Requête d'interrogation de la table PLANS_ZONES sRequetePLZ est une chaîne sRequetePLZ="SELECT PLZ_AFFECTATION,PLZ_X1O,PLZ_Y1O,PLZ_X2O,PLZ_Y2O FROM PLANS_ZONES " SI EnModeTest() ALORS Trace(sRequetePLZ) SI SQLExec(sRequetePLZ,"ReqPLZ") ALORS SQLTable("ReqPLZ",TABLE_PLZ) POUR TOUTE LIGNE DE TABLE_PLZ oPlan:AjouterZonePlanRectangle(allouer un CZonePlanRectangle(allouer un CPoint(TABLE_PLZ.COL_PLZ_X10,TABLE_PLZ.COL_PLZ_Y10),allouer un CPoint(TABLE_PLZ.COL_PLZ_X20,TABLE_PLZ.COL_PLZ_Y20), TABLE_PLZ.COL_PLZ_AFFECTATION)) FIN FIN oPlan:Dessiner()
Ce qui fait que vais avant tout régler ceci avant de communiquer une nouvelle pièce jointe avec le résultat complet.
Ensuite, je commencerais à voir les autres points que vous avez suggérer: mise en couleurs....
Vu mon planning de cet après midi, je vais régler ce problème ce soir et vous communiquerais mon résultat après pour vos éventuels commentaires ou critiques.
Merci pour l'aide précieuse
Bonjour à Tous,
Je suis en train de paramétrer ma table ZONES_PLANS sur mon serveur afin de construire l'ensemble de mes rectangles.
Je comprends bien ce que je fais, mais j'ai tout d'un cout une question stupide:
Explication:
J'ai bien mes 4 coordonnées qui sont X1 , Y1, X2 et Y2.
Si je considère que :
X1 = La distance entre le coté GAUCHE de l'image et le coté GAUCHE du rectangle.
Y1 = La distance entre le haut de l'image et le Haut du rectangle
X2 = A la largeur
Y2 = La hauteur
Alors ma question est peut être idiote, mais de quelle mesure parle t'ont ?
Vu que je galère à renseigner ma table, il y a il une logique qui m'échappe.....(ce qui en soit est très vraisemblable.....)
Par avance merci pour votre aide
Et très bonne journée à Tous
Bonjour
D'une manière générale (en programmation) un rectangle est identifié par 2 points : le point en haut à gauche (coordonnées X1 et Y1) et point en bas à droite (coordonnées X2 et Y2)
Ces coordonnées sont exprimées en pixels par rapport au coin supérieur gauche de l'écran (coordonnées : 0, 0)
Ne mélange pas les notions de coordonnées et de largeur/hauteur
J'espère que ça répond à ta question
Bonjour Guardian,
Je vais tenté d'être le plus clair possible:
1- Sur mon serveur SQL 2005, j'ai crée une table:
a) Nom de la table : PLANS_ZONES
b) Les champs:
De là, et bien entendu en continuité avec ce sujet, au lieu de créer des zones dédiées selon aux boutiques, clients...., j'ai eu dans l'idée de mettre en fond du champ image le plan cadastre du bâtiment logistique.Code:
1
2
3
4
5
6
7
8 - PLZ_SITE varchar(15) = Nom du site (vu que plusieurs sites) - PLZ_NOM varchar(50) = Nom de la zone (exp: Zone clients, boutiques) - PLZ_TYPE numéric(18,0) = 1 pour réception, 2 pour picking, 3 pour réservé.. - PLZ_AFFECTATION varchar(50) = Nom de la travée (TRAVEE A61.....) - PLZ_X1 numéric(18,0) - PLZ_Y1 numéric(18,0) - PLZ_X2 numéric(18,0) - PLZ_Y2 numéric(18,0)
Je créais donc mes zones (rectangles) afin de les "calquer" sur ce plan.
De cette manière, l'utilisateur se retrouve à visualiser chacune des localisations.
Pour ce faire, j'ai le plan devant devant moi, et de là m'est venu cette question.
Mais comme dit, celle ci est peut être stupide par ignorance.
Comme je le dit dans mon précédent message, j'y arrive très bien mais cela est très long, je pensais donc qu'il pouvait y avoir une logique.
Quoi qu'il en soit, merci par avance de vos commentaires ou critiques.
Sachant que si ça se trouve, cela n'a rien à voir avec WD
Bonne après midi
Bonjour Hpascal,
Désolé, j'étais en train de répondre à Guardian pendant que tu m'envoyais ta réponse.
Et bien........limpide
Même si j'aurais préféré une autre réponse.
Merci, je continue
Pourquoi ?Citation:
Même si j'aurais préféré une autre réponse.
Dis moi je peux toujours essayer ;)
Bonsoir Hpascal,
En fait, après ta réponse, j'ai finis par comprendre comment paramétrer la table SQL.
En fait, il m'a suffit de créer avant tout 3 rectangles; 1 au debut, au millieu et à la fin du champ image.
De là, je me sert de ces coordonnées (X1, Y1, X2 et Y2), pour créer tous les autres.
Vu que j'ai divisé le bâtiment en 287 zones de stockage, cela va me prendre quelques heures.
Je devrais pouvoir joindre le résultat pour illustration dés lundi.
Ensuite, je dois me pencher sur la manière de colorer un rectangle au survol de la souris.
EN attendant, bonne soirée
Bonjour Guardian,
En effet, vu que la majorité des zones sont dédiées à du stockage de pièces sur cintres.
Ce qui me donne 3 allées contenant chacune 61 zones, et chaque zone contenant 4 barres de stockage.
Vu que:
1- Chaque rectangle du plan est espacé de 13 pixels.
2- Chaque rectangle est large de 7 pixels
3- Chaque rectangle de la même allée est identique
Alors:
- Je dois pouvoir réaliser 1 requête me permettant:
a) De rechercher les dernières valeurs X1,Y1,X2 et Y2
b) Incrémenter ces mêmes valeurs afin d'obtenir les coordonnées du rectangle suivant.
c) Une requête INSERT devrait faire la suite.
Merci pour le coût de main
Bon Dimanche
Personnellement, j'aurais procédé sans relecture de la base (inutile puisque tu sais que que tu y as écrit)
Bonjour à Tous,
Comme l'a suggérer Vmolines, je fais le point sur la création de zones cliquables à l'intérieur d'un champ image.
NB: A noter:
Serveur : SQL 2005 et 2008
Connexion : ODBC
1- La table SQL: PLANS_ZONES (ou fichier HF)
Ensuite, cette table doit avoir une liaison avec la table STOCKS qui, elle possède entre autre un champ STOC_EMPLACEMENT qui va servir à connaitre le détail des pièces se trouvant dans chaque zoneCode:
1
2
3
4
5
6
7
8 - PLZ_SITE varchar(15) = Nom du site (vu que plusieurs sites) - PLZ_NOM varchar(50) = Nom de la zone (exp: Zone clients, boutiques) - PLZ_TYPE numéric(18,0) = 1 pour réception, 2 pour picking, 3 pour réservé.. - PLZ_AFFECTATION varchar(50) = Nom de la travée (TRAVEE A61.....) - PLZ_X1 numéric(18,0) - PLZ_Y1 numéric(18,0) - PLZ_X2 numéric(18,0) - PLZ_Y2 numéric(18,0)
NB: Grâce à Hpascal, je sais maintenant que les données de la table(fichier) se mesure en pixels.
2- Création de la fenêtre WD
3- Création du champ image
Mais là, j'ai rencontré un problème auquel je n'avais pas perçu l'importance lors de la création du champ (donc j'ai dû recommencer).
En effet, en cas de modification des ancrages du champ ou du mode d'affichage d'une image de fond, les formes crées ne n'adapterons pas à l'image de fond ou au champ tout simplement.
Moralité:
A la deuxième tentative, j'ai avant tout:
- Ancré mon champ image
- Définis une fois pour toute le mode d'affichage de l'image de fond du champ (dans mon cas un plan).
- J'ai crée deux rectangles
- 1 à droite
- 1 autre à gauche
Ceci afin de me fixer un repaire et de contrôler l'alignement du tout (Formes et image de fond)
Pour le code:
4 classes:
-CPoint
-Cplan
-CRectangle
-CZonePlanRectangle
CPoint:
CPlan:Code:
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20 Déclaration: CPoint est une classe X est un entier Y est un entier FIN Constructeur: PROCEDURE Constructeur(LOCAL pX est un entier, LOCAL pY est un entier) :X = pX :Y = pY Méthode: FONCTION EstDansRectangle(poRectangle est un CRectangle dynamique) RENVOYER =((:X >=poRectangle:oPoint1:X ET :X <+ poRectangle:oPoint2:X) ET (:Y >= poRectangle:oPoint1:Y ET :Y <= poRectangle:oPoint2:Y))
Code:
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34 Déclaration: CPlan est une classe sChampImage est une chaîne tabTaboZonePlan est un tableau de 0 CZonePlanRectangle dynamique FIN Constructeur: PROCEDURE Constructeur(LOCAL psChampImage est une chaîne) :sChampImage = psChampImage Méthode 1: PROCEDURE AjouterZonePlanRectangle(poZoneRectangle est un CZonePlanRectangle dynamique) TableauAjoute(:tabTaboZonePlan, poZoneRectangle) Méthode 2: PROCEDURE Dessiner() liFontSize est un entier = 8 dDébutDessin(:sChampImage) dStylo(Noir,0,12) dPolice("Arial",liFontSize,iNormal,0) oZonePlanRectangle est une CZonePlanRectangle dynamique POUR TOUT ELEMENT oZonePlanRectangle DE :tabTaboZonePlan oZonePlanRectangle:Dessiner() FIN
CRectangle:
CZonePlanRectangleCode:
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18 Déclaration: CRectangle est une classe oPoint1 est un CPoint dynamique oPoint2 est un CPoint dynamique FIN Constructeur: PROCEDURE Constructeur(poPoint1 est un CPoint dynamique, poPoint2 est un CPoint dynamique) :oPoint1 = poPoint1 :oPoint2 = poPoint2 Méthode: //Définition du mode de remplissage et de la couleurs des traits des formes PROCEDURE Dessiner() dRectangle(:oPoint1:X, oPoint1:Y, oPoint2:X, oPoint2:Y,Transparent,BleuFoncé)
Dans le code de la déclaration globale de la fenêtre:Code:
1
2
3
4
5
6
7
8
9
10
11
12 Déclaration: CZonePlanRectangle est une classe hérite de CRectangle slibellé est une chaîne FIN Constructeur: PROCEDURE Constructeur(poPoint1 est un CPoint dynamique, poPoint2 est un CPoint dynamique, LOCAL psLibelle est une chaîne) Constructeur CRectangle(poPoint1, poPoint2) slibellé = psLibelle
Et dans le code du CLIC du champ IMAGECode:
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15 //CONSTRUCTION DE L'IMAGE //Requête permettant l'appel de l'ensemble des données de la table //PLANS_ZONES oPlan est un CPlan(IMG_Image1..Nom) sRequetePLZ est une chaîne sRequetePLZ="SELECT PLZ_AFFECTATION,PLZ_X1O,PLZ_Y1O,PLZ_X2O,PLZ_Y2O FROM PLANS_ZONES1 " SI EnModeTest() ALORS Trace(sRequetePLZ) SI SQLExec(sRequetePLZ,"ReqPLZ") ALORS SQLTable("ReqPLZ",TABLE_PLZ) POUR TOUTE LIGNE DE TABLE_PLZ oPlan:AjouterZonePlanRectangle(allouer un CZonePlanRectangle(allouer un CPoint(TABLE_PLZ.COL_PLZ_X10,TABLE_PLZ.COL_PLZ_Y10),allouer un CPoint(TABLE_PLZ.COL_PLZ_X20,TABLE_PLZ.COL_PLZ_Y20), TABLE_PLZ.COL_PLZ_AFFECTATION)) FIN FIN oPlan:Dessiner()
J'ai opté pour l'affichage dans la barre message de la fenêtre.Code:
1
2
3
4
5
6
7
8 oPointClic est un CPoint(SourisPosX(), SourisPosY()) //oZoneClic est un CZonePlanRectangle dynamique = oPlan:ZoneRectangleDepuisPoint(oPointClic) oZoneClic est un CZonePlanRectangle dynamique = oPlan:ZoneRectangleDepuisPoint(oPointClic) SI oZoneClic <> Null ALORS Message("Vous êtes sur : " +oZoneClic:slibellé) FIN
Ce qui implique d'activer l'option dans les paramètres su style de la fenêtre.
Sinon, une info, mais cela oblige de valider chaque info.
Pour le résultat de tut cela, j'ai mis une pièce jointe.
Pour la seconde partie, il me faut:
- Mise en couleur d'un rectangle au survole de la souris
- Afficher dans une table mémoire (qui va se trouver en dessous du champ image), le contenu de chaque rectangle.
- Mise en couleur d'un rectangle dés lors que la quantité de pièces dans une zone est > à 0.
Voilà pour le moment
Mais à ce stade, je remercie
Vmolines, sans qui je n'y serais pas arrivé
Hpascal qui m'a appris ce qu'était la mesure pixel
Guardian qui m'a permis de ne pas passer mon dimanche à remplir une table.
Bon dimanche à Tous
Guardian,
Comme quoi le vielle à d'age se vérifie
"Pourquoi ne pas faire simple pendant que je me complique la vie"
Merci beaucoup
Je t'avoue que je n'ai pas lu tout ton code, donc je te fais juste une suggestion "de principe".
Je suppose que le contenu vient d'une base ?Citation:
Je tente de faire apparaitre dans une table mémoire le contenu d'un rectangle
Lorsque tu remplis ton rectangle, associe-lui un ID qui te permettra de relire facilement ta base.