Can you filter random values within a range using an expression?
"Please look at image attached"
i.e I have 495 Wedge Index's generated.
I would like to randomly delete 200 index's at random and not in a sequential order that is set in the range. So a total of 200 index's will be deleted but selected at random.
Would this be done in using a filter by range or filter by expression.
If so. what expression is best to do this.
I have tried this python script but it doesn't seem to work:
("`@pdg_frame`" if "`@pdg_frame`" in random.choices(range(0,10), k=10) else None)
Filter by Expression/Range to delete wedge nodes at Random
2604 3 0- longedesigns
- Member
- 10 posts
- Joined: April 2019
- Offline
- tpetrick
- Staff
- 600 posts
- Joined: May 2014
- Offline
You can't mix HScript expression functions/variables like @pdg_frame and Python in the same expression. If you're using a Python expression, you'll need to use pdg.workItem() to access the work item that the parameter is being evaluated against. For example, pdg.workItem().frame in a Python expression is the same as @pdg_frame in an HScript expression.
pdg.workItem() will return a pdg.WorkItem instance that you can use to access attributes and intrinsic data: https://www.sidefx.com/docs/houdini/tops/pdg/WorkItem.html [www.sidefx.com]
pdg.workItem() will return a pdg.WorkItem instance that you can use to access attributes and intrinsic data: https://www.sidefx.com/docs/houdini/tops/pdg/WorkItem.html [www.sidefx.com]
Edited by tpetrick - May 17, 2022 12:10:09
- longedesigns
- Member
- 10 posts
- Joined: April 2019
- Offline
- tpetrick
- Staff
- 600 posts
- Joined: May 2014
- Offline
It's pretty hard to say what the issue is without actually seeing the .hip file.
If you want to delete exactly 200 work items, then that approach probably won't work. The filter expression is evaluated independently for each work item, which means there's no shared state and no way for you to ensure that an exact number are deleted. You're better of using a Python Processor TOP, which has access to the full list of input work items. Something like:
If you want to delete exactly 200 work items, then that approach probably won't work. The filter expression is evaluated independently for each work item, which means there's no shared state and no way for you to ensure that an exact number are deleted. You're better of using a Python Processor TOP, which has access to the full list of input work items. Something like:
import random choices = random.sample(range(0, len(upstream_items)), k=200) for index, upstream_item in enumerate(upstream_items): if index not in choices: item_holder.addWorkItem(parent=upstream_item)
-
- Quick Links