Hi Thomas, Frank,

Here's two functions that help you move a python list or list of lists  
to their corresponding OCC types.
These work well and generically.
Until we find a more pythonic approach this is pretty practical.

-jelle

def _Tcol_dim_1(li, _type):
     '''function for 1-dimensional TCol* types'''
     pts = _type(0, len(li)-1)
     for n,i in enumerate(li):
         pts.SetValue(n,i)
     pts.thisown = False
     return pts

def _Tcol_dim_2(li, _type):
     '''function for 2-dimensional TCol* types'''
     length_nested = len(li[0])-1
     pts = _type(0, len(li)-1, 0, length_nested)
     pts.thisown = False
     return pts
     for n1,i in enumerate(li):
         for n2,j in enumerate(i):
             pts.SetValue(n1,n2,j)
     return pts

     a1,a2,a3,a4 = [],[],[],[]

     a1.append([gp_Pnt(1,1,1),gp_Pnt(2,1,2),gp_Pnt(3,1,1)])
     a1.append([gp_Pnt(1,2,1),gp_Pnt(2,2,2),gp_Pnt(3,2,0)])
     a1.append([gp_Pnt(1,3,2),gp_Pnt(2,3,1),gp_Pnt(3,3,0)])

     a2.append([gp_Pnt(3,1,1),gp_Pnt(4,1,1),gp_Pnt(5,1,2)])
     a2.append([gp_Pnt(3,2,0),gp_Pnt(4,2,1),gp_Pnt(5,2,2)])
     a2.append([gp_Pnt(3,3,0),gp_Pnt(4,3,0),gp_Pnt(5,3,1)])

     a3.append([gp_Pnt(1,3,2),gp_Pnt(2,3,1),gp_Pnt(3,3,0)])
     a3.append([gp_Pnt(1,4,1),gp_Pnt(2,4,0),gp_Pnt(3,4,1)])
     a3.append([gp_Pnt(1,5,1),gp_Pnt(2,5,1),gp_Pnt(3,5,2)])

     a4.append([gp_Pnt(3,3,0),gp_Pnt(4,3,0),gp_Pnt(5,3,1)])
     a4.append([gp_Pnt(3,4,1),gp_Pnt(4,4,1),gp_Pnt(5,4,1)])
     a4.append([gp_Pnt(3,5,2),gp_Pnt(4,5,2),gp_Pnt(5,5,1)])


     bezier_input = [_Tcol_dim_2(i, TColgp_Array2OfPnt) for i in  
[a1,a2,a3,a4]]

     harray = []
     harray.append(P1.Translated(gp_Vec(4,0,0)))
     harray.append(P2.Translated(gp_Vec(4,0,0)))
     harray.append(P3.Translated(gp_Vec(4,0,0)))
     harray.append(P4.Translated(gp_Vec(4,0,0)))
     harray.append(P5.Translated(gp_Vec(4,0,0)))


     aaa = _Tcol_dim_1(harray, TColgp_HArray1OfPnt)

On Mar 27, 2009, at 6:49 AM, Thomas Paviot wrote:

>
>> When using pythonocc, is there any reason for using OCC's list,
>> sequence, and map classes instead of Python's built-in list and  
>> dict types?
>>
>> For example, if I wish to collect shapes to operate on, is there any
>> reason to use TopTools_ListOfShape instead of a Python list (assuming
>> the list of shapes is only used/accessed on the "Python-side")?
>>
>
> Hi Frank,
>
> Thanks for asking this question! It's for me the opportunity to  
> explain
> the development process before I answer.
>
> The primary goal of pythonOCC was to provide a Python wrapper to
> OpenCascade 6.3.0 that would be *as close as* possible to the original
> C++ library. This way, it would have been very easy to move from  
> Python
> to C++ code or the opposite. For instance, if you ever tried to port a
> C++ sample to pythonOCC, you can notice it can be done in a few  
> minutes:
> in a sense, you just have to remove '{};' from C++ and copy/paste to
> your Python IDE. pythonOCC can be then considered as a rapid  
> prototyping
> OpenCascade application.
>
> The problem is that if you want to stay close to the original API, two
> mechanisms are *not pythonic* at all. I mean:
> (1) OpenCascade memory management: smart pointers/reference counting,
> (2) Strong typing.
>
> The point (1) is critical. Much improvements have been made these last
> weeks: the 0.1 release was almost unusable, and the samples that were
> recently added require the latest svn rev. to properly run. The memory
> segfaults are fixed, there is still some work to do to reduce memory
> consumption.
>
> Consequences of the point (2) are that you have to use OpenCascade
> arrays and cannot use Python built-in types (lists, dicts). For
> instance, if you want to create a BSpline from a set of points, you  
> have
> to do:
>
> P1 = gp_Pnt(0,0,1)
> P2 = gp_Pnt(1,2,2)
> P3 = gp_Pnt(2,3,3)
> array = TColgp_Array1OfPnt(1,3)
> array.SetValue(1,P1)
> array.SetValue(2,P2)
> array.SetValue(3,P3)
> SPL1 = GeomAPI_PointsToBSpline(array)
>
> If it would really pythonic, then we should have to do something like:
>
> P1 = gp_Pnt(0,0,1)
> P2 = gp_Pnt(1,2,2)
> P3 = gp_Pnt(2,3,3)
> array = [P1,P2,P3]
> SPL1 = GeomAPI_PointsToBSpline(array)
>
> That would be quite more elegant and allow to access list methods  
> (sort,
> reverse, pop etc.) that are so useful. It's not so hard to  implement
> with SWIG, and many howtos are availble to deal with Python lists and
> C/C+ arrays. But it wasn't, untill now, the priority: all development
> time and energy was focused on memory management, module extensions  
> and
> portability. The last two points are almost achieved, memory needs a  
> few
> work. We can now think about pythonOCC API polish. This is then how I
> see the few coming weeks/months of work:
>
> * First point (high priority): pythonOCC must be as memory safe as
> OpenCascade. It's not yet the case.
>
> * Second point (medium priority): make pythonOCC more pythonic, that  
> is:
>    - completely hide memory management stuff to pythonOCC users:  
> things
> like smart pointers, OCC Handles or DownCasting have nothing to do  
> with
> python idioms,
>    - make a better use of built-in python types to handle OCC lists  
> and
> arrays.
>
> The consequence of this second point is that the pythonOCC API will be
> quite different from OpenCascade: the port from C++/Python or Python/ 
> C++
> will be less natural and simple. But maybe it's time that pythonOCC  
> live
> its own life, I mean build its own 'personality' and break free from  
> all
> these stupid C++ things that made us become python lovers!
>
>> Thanks,
>> Frank Conradie
>>
>
> Best Regards,
>
> Thomas
>
>
> _______________________________________________
> 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