2011/9/20 Thomas Paviot <[email protected]>

> 2011/9/20 Thomas Paviot <[email protected]>
>
>> 2011/9/20 D. Barbier <[email protected]>
>>
>>> On 2011/9/1 D. Barbier wrote:
>>> [...]
>>> >  $ LD_LIBRARY_PATH=$HOME/oce-dev/lib python test_all.py
>>> >  Traceback (most recent call last):
>>> >    File "test_all.py", line 29, in <module>
>>> >      import topology_operations_unittest
>>> >    File
>>> "/home/barbier/Projects/pythonocc/src/unittest/topology_operations_unittest.py",
>>> > line 34, in <module>
>>> >      from OCC.Utils.Construct import *
>>> >    File
>>> "/home/barbier/.local/lib/python2.6/site-packages/OCC/Utils/Construct.py",
>>> > line 50, in <module>
>>> >      from OCC.GEOMAlgo import GEOMAlgo_Splitter
>>> >  ImportError: No module named GEOMAlgo
>>>
>>> I modified Construct.py to not import GEOM,
>>
>>
>> You're right, the depency of Construct.py with GEOM should be removed.
>> It's a recent commit that is not consistent with the optional GEOM wrapper.
>>
>>
>>> but get now a segmentation fault:
>>>  testHash (wrapper_features_unittest.TestWrapperFeatures) ... Test:
>>> __hash__ overloading
>>>  Segmentation fault
>>>
>>> More precisely:
>>>  $ python
>>>  Python 2.6.7 (r267:88850, Aug  3 2011, 11:33:52)
>>>  [GCC 4.6.1] on linux2
>>>  Type "help", "copyright", "credits" or "license" for more information.
>>>  >>> import OCC.Standard
>>>  >>> s = OCC.Standard.Standard_Transient()
>>>  >>> hash1_s = s.__hash__()
>>>  >>> hash2_s = s.HashCode(pow(2,31)-1)
>>>  Segmentation fault
>>>
>>> But also:
>>>  $ python
>>>  Python 2.6.7 (r267:88850, Aug  3 2011, 11:33:52)
>>>  [GCC 4.6.1] on linux2
>>>  Type "help", "copyright", "credits" or "license" for more information.
>>>  >>> import OCC.Standard
>>>  >>> s = OCC.Standard.Standard_Transient()
>>>  >>> hash2_s = s.HashCode(pow(2,31)-1)
>>>  >>> hash1_s = s.__hash__()
>>>  Segmentation fault
>>>
>>> and even
>>>
>>>  $ python
>>>  Python 2.6.7 (r267:88850, Aug  3 2011, 11:33:52)
>>>  [GCC 4.6.1] on linux2
>>>  Type "help", "copyright", "credits" or "license" for more information.
>>>  >>> import OCC.Standard
>>>  >>> s = OCC.Standard.Standard_Transient()
>>>  >>> hash1_s = s.__hash__()
>>>  >>> hash1_s = s.__hash__()
>>>  Segmentation fault
>>>
>>> Any idea about what is going on?
>>>
>>
>> When compiling pythonocc, you must pass -D__PYTHONOCCOCC_MAXINT__ integer.
>> It's equal to 2^32-1 on 32bit platforms, 2^64-1 on 64bit. This is computed
>> from the file environment.py (
>> https://github.com/tpaviot/pythonocc/blob/master/src/wrapper/environment.py)
>> called when compiling pythonocc from the setup.py script.
>>
>> The __hash__() method does not take any argument. It is a wrapper for the
>> HashCode method and is is defined in the SWIG file as:
>>
>> %extend Standard_Transient {
>>
>>      Standard_Integer __hash__() {
>>      return $self->HashCode(__PYTHONOCC_MAXINT__);
>>      }
>> };
>>
>>  (see for instance the file Standard.i at
>> https://github.com/tpaviot/pythonocc/blob/master/src/wrapper/SWIG/linux_darwin/Standard.i
>> ).
>>
>>
>>> Denis
>>>
>>
>> Thomas
>>
>>
> Sorry, it's 2^31-1 or 2^63-1 (not 2^32-1 and 2^64-1)
>
> You can use the hash python builtin function to test that the __hash__
> method works:
>
> $ python
> Python 2.6.1 (r261:67515, Jun 24 2010, 21:47:49)
> [GCC 4.2.1 (Apple Inc. build 5646)] on darwin
>
> Type "help", "copyright", "credits" or "license" for more information.
> >>> from OCC.Standard import *
> >>> s = Standard_Transient()
> >>> hash(s)
> 105437969
> >>>
>
> The __hash__ method was introduced to allow OCC objects be dict keys, or
> use the 'in' list feature. For example :
> $ python
> Python 2.6.1 (r261:67515, Jun 24 2010, 21:47:49)
> [GCC 4.2.1 (Apple Inc. build 5646)] on darwin
>
> Type "help", "copyright", "credits" or "license" for more information.
> >>> from OCC.Standard import *
> >>> s1 = Standard_Transient()
> >>> s2 = Standard_Transient()
> >>> s3 = Standard_Transient()
> >>> s4 = Standard_Transient()
> >>> l = [s1,s2,s3]
> >>> l = [s1,s2,s3]
> >>> s1 in l
> True
> >>> s2 in l
> True
> >>> s4 in l
> False
>
> or
>
> >>> d = {}
> >>> d[s1]= "A first transient"
> >>> d[s2]= "A second transient"
> >>> d
> {<OCC.Standard.Standard_Transient; proxy of <Swig Object of type
> 'Standard_Transient *' at 0x10054a0c0> >: 'A first transient',
> <OCC.Standard.Standard_Transient; proxy of <Swig Object of type
> 'Standard_Transient *' at 0x100545e70> >: 'A second transient'}
> >>> d[s1]
> 'A first transient'
> >>> d[s2]
> 'A second transient'
> >>>
>
> Thomas
>
>
Denis,

I pushed 2 branches to github : tp/cmake-improvements, which includes the 4
patches you submitted, as well as tp/advanced-construct that removes the
dependency of Construct.py upon GEOM (related function is moved to
AdvancedConstruct.py which requires the GEOM wrapper to be built).

Thomas
_______________________________________________
Pythonocc-users mailing list
[email protected]
https://mail.gna.org/listinfo/pythonocc-users

Reply via email to