Hello , I have an Tag dataset OF WECAM like :
Column1 is ID of webcam.
What I want is, when I click on an webcam for exemple webcam ID = 11
I want obtain a dataset like:
Column2 is zone where webbcam is located
You would need to explain your selection rule. For example, why would 44 and 66 show up when you select 11? Can you see why this might be confusing to us?
I ran the code below in the script console. It demonstrates creating your original dataset, filtering it based off of a selection in Column1, and then creating a new dataset with ID matching what was selected. I based it off the example shown here in the docs:
https://docs.inductiveautomation.com/display/DOC81/Datasets
# Create original dataset through scripting
headers = ['Column1', 'Column2']
data = []
data.append([11, 'A'])
data.append([22, 'B'])
data.append([33, 'C'])
data.append([44, 'A'])
data.append([55, 'D'])
data.append([66, 'A'])
data.append([11, 'B'])
original_ds = system.dataset.toDataSet(headers, data)
# Change this from a hard coded variable to a user input/selection.
selection = 11
new_headers = ['Column1', 'Column2']
new_data = []
for row in range(original_ds.getRowCount()):
# Unpack variables from original ds to examine
myID = original_ds.getValueAt(row, 'Column1')
myLetter = original_ds.getValueAt(row, 'Column2')
# Compare original ds against selection
if myID == selection:
new_data.append([myID, myLetter])
else:
pass
# Create new dataset.
new_ds = system.dataset.toDataSet(new_headers, new_data)
print original_ds
print new_ds
Results:
I agree with transistor here, there's no clear correlation between the input and the output you've shown.
You'll need to be more accurate about what you want to do.
When I click on webcam 11, I must get all webcam that have Same zone (Column2) and I also get all column where ID webcam = 11
So your result dataset should also contain [22, B]
? You forgot this one in your first post.
def filter_cams(cameras, selected_id):
ds = system.dataset.toPyDataSet(cameras)
zones = {row['zone'] for row in ds if row['id'] == selected_id}
filtered_ds = filter(lambda x: x['id'] == selected_id or x['zone'] in zones, ds)
return system.dataset.toDataSet(list(cameras.columnNames), filtered_ds)
Bonjour Pascal, en fait chaque webcam appartient Ă une zone qui sont zone soit zone A, B, C ou D
Il arrivera le cas ou un webcam appartiendra deux ou trois zone par exemple A, B et C.
alors ce que je dois faire est que lorsque je clique sur webcam 11 qui appartient à la zone A, je dois récupérer un dataset qui contient ID de webcam qui appartient à la zone A ( le ID 44 et 66 dans le dataset) et récupérer également autre zones dont du ID du webcam =11 ( zone B dans le dataset)
Si la camera 11 appartient aux zones A et B, et que tu veux les autres caméras de la zone A, alors logiquement il te faut aussi les autres caméras de la zone B.
Sinon la règle de sélection que tu annonces n'est pas complète.
Non, if I click on webcam 22, I must obtain:
Column1 | Column2 |
22 | B |
11 | B |
Je te parle pas de la 22, mais si je suis la règle que tu as décrite:
- On sélectionne la caméra 11.
on a
id | zone |
---|---|
11 | A |
11 | B |
- La caméra 11 est dans la zone A. Donc on sélectionne les autres caméras de la zone A:
id | zone |
---|---|
11 | A |
11 | B |
44 | A |
66 | A |
- la caméra 11 est dans la zone B, donc on sélectionne aussi les caméras de la zone B:
id | zone |
---|---|
11 | A |
11 | B |
44 | A |
66 | A |
22 | B |
Merci pour ton explication. Oui, tu as évidement raison. Mais il aura une popu qui va éviter avoir ça dans le dataset.
Dès qu'un camera appartiendra plusieurs Zones, une popup s'ouvrira dès l'utilisateur clique sur la webcam pour demander l'utilisateur la Zone qu'il veut regarder .
S'il dit Zone B, il y aura que zone B dans le dataset , s'il dit Zone A, il n y 'aura que Zone A
2 solutions:
-
utilise la fonction que j'ai posté plus haut pour avoir toutes les caméras possible,
ensuite demande à l'utilisateur quelle zone il veut en faisant un set à partir des zones dans le dataset déjà filtré,
puis refiltre en ne gardant que cette zone -
Utilise ces fonctions là pour d'abord extraire les zones qui correspondent à la caméra, ensuite demande à l'utilisateur quelle zone il veut puis utilise la zone choisie pour filtrer les caméras:
def filter_cams(cameras, zone):
ds = system.dataset.toPyDataSet(cameras)
filtered_ds = filter(lambda x: x['zone'] == zone, ds)
return system.dataset.toDataSet(list(cameras.columnNames), filtered_ds)
def get_zones(cameras, selected_id):
return [cam['zone'] for cam in system.dataset.toPyDataSet(cameras) if cam['id'] == selected_id]
edit: Ah, il faut aussi l'entrée [11, B]
?
Dans ce cas il faut modifier le filtrage:
def filter_cams(cameras, selected_id, zone):
ds = system.dataset.toPyDataSet(cameras)
filtered_ds = filter(lambda x: x['zone'] == zone or x['id'] == selected_id, ds)
return system.dataset.toDataSet(list(cameras.columnNames), filtered_ds)
edit 2:
Tes caméras sont dans une base de données ?
Si c'est le cas, autant faire le filtrage directement dans la requĂŞte.
Sont dans un Tag
You don't have to keep deleting your posts. Edit them instead. There's a pencil icon below each of your posts.
Une base de données te simplifierait les choses à mon avis.