predicte

Asked by nobody on 2020-04-28

Hi All,
last time I asked the question in this post:https://answers.launchpad.net/yade/+question/690079

one answer for the local bodies is we can use the following code:
###
The same for interactions (e.g. based on their contactPoint):
###
predicate = pack.inAlignedBox(...)
localIntrs = [i for i in O.interactions if predicate(i.geom.contactPoint)]

#################
I did the same way, here is my code:
def local_interaction():
 predicate = pack.inAlignedBox((0.1,0.1,0.1),(0.15,0.15,0.15))
 #predicate = pack.inSphere((0.2,0.2,0.1), 0.1)
 localintrs = [i for i in O.interactions if predicate(i.geom.contactPoint)]
 for i in localintrs:
  constnormal1 = i.geom.normal[0]
  constnormal2 = i.geom.normal[1]
  constnormal3 = i.geom.normal[2]
 print('this is contact normal 1:',constnormal1)
 print('this is contact normal 2:',constnormal2)
 print('this is contact normal 3:',constnormal3)
###############but I got the error:
In [1]: ---------------------------------------------------------------------------
ArgumentError Traceback (most recent call last)
/usr/bin/yade in <module>()

/usr/bin/yade in local_interaction()
     40 predicate = pack.inAlignedBox((0.1,0.1,0.1),(0.15,0.15,0.15))
     41 #predicate = pack.inSphere((0.2,0.2,0.1), 0.1)
---> 42 localintrs = [i for i in O.interactions if predicate(i.geom.contactPoint)]
     43 for i in localintrs:
     44 constnormal1 = i.geom.normal[0]

ArgumentError: Python argument types in
    Predicate.__call__(inAlignedBox, Vector3)
did not match C++ signature:
    __call__(PredicateWrap {lvalue}, Eigen::Matrix<double, 3, 1, 0, 3, 1>, double)
    __call__(Predicate {lvalue}, Eigen::Matrix<double, 3, 1, 0, 3, 1>, double)
###############
sorry, I don't know the error, but i know it's related to line 42 "if predicate(i.geom.contactPoint)]-------------here"
it seems i need to add something here.
######################
if we use another code post at that question.
###
predicate = pack.inAlignedBox(...) # or other instance or combination of several predicates
localBodies = [b for b in O.bodies if predicate(b.state.pos,b.shape.radius)]
###
these code didn't give me error.
but if i change here----------------if predicate(b.state.pos,b.shape.radius)]------to-------if predicate(b.state.pos)], it will give me the same error.
for these code, i think we need the position as well as the radius to identify one sphere, so we need:b.state.pos,b.shape.radius.
but for an interaction point, why we can't just use i.geom.contactPoint to determine the contact point is in this predicate or not?

overall, I think my question is how to use the predicate to determine whether a contact point is in this predicate or not?

thanks
Yong

Question information

Language:
English Edit question
Status:
Solved
For:
Yade Edit question
Assignee:
No assignee Edit question
Solved by:
Jan Stránský
Solved:
2020-04-29
Last query:
2020-04-29
Last reply:
2020-04-28
Best Jan Stránský (honzik) said : #1

calling predicate needs two parameters, point and "radius"
if you are interested merely in the position, pass 0 as the second argument.
The documentation of this should be improved, see issue [1]
cheers
Jan

[1] https://gitlab.com/yade-dev/trunk/-/issues/154

nobody (nobody01) said : #2

Hi Jan,

thank you very much! it works!

nobody (nobody01) said : #3

Thanks Jan Stránský, that solved my question.