Hello Franck,

It's really a good idea to map the Hash() OpenCascade method and the 
python __hash__(). I read a few posts on the __hash__() topic. A good 
one is, for instance: 
http://mail.python.org/pipermail/python-dev/2003-September/037923.html .

It's said that 'object.__hash__() returns id(obj) by default'. I tested 
that a little:
 >>> a = object()
 >>> a.__hash__()
10093672
 >>> id(a)
10093672
 >>>

But, if __hash__ is overloaded, then __hash() and id() returns 2 
different integers.

This is then my proposition:
- *for each* pythonOCC object that is managed by Handle_* (and thus, for 
which the HashCode() method is available), overload the __hash__ method 
as Frank said. It can be done within SWIG with two or three more lines 
in the SWIG_generator.py script.
- for other pythonOCC objects, leave the default __hash__ method (thus 
equivalent to id() )

Thomas

Frank Conradie a écrit :
> Hi Jelle
>
> My particular need was to hash TopoDS_Shape objects properly. I'm not 
> sure if this is a good permanent solution, but this works for me, for 
> shapes at least:
>
> def shape_hash(self):
>     return self.HashCode(sys.maxint)
> TopoDS.TopoDS_Shape.__hash__ = shape_hash
>
> Now I can use shapes in a Python set and as keys in a Python dict - 
> which also means that your Topology.Topo class works properly now (if 
> topo_item in topo_set)!
>
> I can't help thinking there must be a more general way to incorporate 
> this into the SWIG wrapper for *all* OCC classes, but I don't know 
> enough about swig yet to know for sure.
>
> Cheers,
> Frank
>
> jelle feringa wrote:
>>
>>     In order to use pythonocc objects in sets and as dict keys, they
>>     must hash to the underlying OCC object. In fact, your Topo class
>>     uses a set internally that does not work because of this very
>>     fact, because set checks for set membership via hash, and thus,
>>     two of the same objects that get explored will hash to different
>>     values and thus be passed back twice.
>>
>>
>> Hi Frank,
>>
>> This is really interesting, thanks so much for explaining.
>> Actually, now I recall what I messed up. I looped through a list of 
>> some topology, lets say vertices and checked for their id -> id(vertex).
>> That did work, however as you point out hash != id.
>> I think overloading the hash with comparing id()'s could work.
>>  
>>
>>     Hope this makes sense.
>>
>>
>> A lot, thanks for your advice here.
>>  
>>
>>     I suppose I could overwrite __hash__ the same way you guys
>>     initially got past the == issue.
>>
>>
>> What do you think of overloading hash with id?
>> I'll check tomorrow morning, would be great if this is a stable fix, 
>> it sure could be useful.
>>
>> Thanks,
>>
>> -jelle
>>
> ------------------------------------------------------------------------
>
> _______________________________________________
> Pythonocc-users mailing list
> Pythonocc-users@gna.org
> https://mail.gna.org/listinfo/pythonocc-users
>   

_______________________________________________
Pythonocc-users mailing list
Pythonocc-users@gna.org
https://mail.gna.org/listinfo/pythonocc-users

Reply via email to