Dear All,

I start a new thread related to the wrapper generation, especially the 
way the files needed by SWIG are created from OpenCascade headers. This 
thread is an answer to Brian's request: "I have a some experience with 
SWIG, but I've never used pygcc_xml. It would be useful if Thomas could 
briefly describe the approach he's taking in making the wrappers. In 
particular, assuming pygcc_xml can construct .i files covering the 
common cases, how do you handle special cases? Do you just added a few 
manually created .i files?".

This post maybe be quite important if you:
- wish to hack the SWIG files available in the source distribution,
- want to contribute to the project and help to make the pythonOCC 
wrapper better.

Here is then a first small post that I will precise according to your 
questions (if you have any).

1. The use of SWIG as the wrapper generator

There are many ways to access C++ libraries with Python. SIP, 
Boost/Python, SWIG, ctypes etc. are possible solutions and the choice of 
SWIG for pythonOCC was made in April or May 2008, after 3 months of 
development with Boost/Python.
To generate a python wrapper to a C++ libray with SWIG, you need:
- the header files (in our case, the thousands of .hxx files located in 
the $CASROOT/inc folder),
- the lib files (under Windows, availble in the $CASROOT/win32/lib folder),
- a set of SWIG ascii files. These file have the extension '.i'

2. Many python modules necessary to wrap many² OpenCascade packages

First let's be on the same definitions about modules and packages: an 
OpenCascade *package* is a set of C++ classes/methods dedicated to a 
specific field. For instance, AIS (Advanced Interactive System) is a 
package that handle data visualization/selection. All the 
classes/methods are described in a set of header files that being whit 
AIS_. Just enter 'ls AIS_*.hxx' (under linux) or 'dir AIS_*.hxx' 
(Windows) from the /inc directory, and you'll get 97 results 
(OpenCascade 6.3.0):

22/08/2008  17:31            10 690 AIS_AngleDimension.hxx
22/08/2008  17:31             4 952 AIS_AttributeFilter.hxx
...
22/08/2008  17:31             1 704 AIS_TypeOfIso.hxx
22/08/2008  17:31             1 315 AIS_TypeOfPlane.hxx

All the classes/methods of AIS are wrapped in one python *module*, that 
is, a python script named AIS.py and a library file (_AIS.pyd under 
Windows or _AIS.so under Linux). To use AIS features, you just have to do:
 >> from AIS import *

SWIG automatically created the AIS.py ans _AIS.so files from the 
previous headers and a set of .i files:
AIS.i
AIS_dependencies.i
AIS_headers.i

pythonOCC is a bit special in the sense that all the .i files, for each 
OpenCascade package, are generated automatically by a python script 
named 'SWIG_generator.py'.

3. Special cases?

Brian asks a *very* good question: "how do you handle special cases?". 
The question can be answered by this simple observation: pythonOCC 
covers thousands of classes and dozain of thousands methods whereas the 
SWIG_generator.py script is 'only' 867 lines of code. It means that 
there are very very few special cases and that I tried to have the most 
standardized solution as possible, to *avoid* special cases. However, 
despite all my efforts, there are still a few 'special cases' that are 
handled with if/then/else or try/except blocks in the generator script.

For instance, the line 297-298:
"""
if sys.platform=='win32' and module_name=='WNT':
            return True
"""
deals with a special case.

It's important at this point to note that all special cases are handled 
in the generator_script. There is no manual tweak of resulting SWIG 
files. That means that the whole pythonOCC is obtained with only 3 
python scripts: setup.py, environment.py, SWIG_generator.py and 
Module.py. These 4 scripts are necessary and sufficient for compiling 
pythonOCC.

Two pythonOCC modules are not wrappers to OpenCascade packages: Misc and 
Visualization. I will write a special post for these strange modules.

4. The 4 python scripts

- environment.py : the file that contains platform specific paths. You 
have to hack this file so that pythonOCC compile on your machine,
- setup.py : the distutil based compilation script. Will be replaced by 
scons script as soon as it is ready.
- SWIG_generator.py: see point 3
- Modules.py: the list of OCC packages that will have to be wrapped by a 
python module.

5. How are generated the .i files required by SWIG?

The method I used is unique, in the sense that I did not yet see any 
other open source project using both GCCXML, pygccxml, pyplusplus and 
SWIG. GCCXML/pygccxml is an amazing couple of tools:

- from a set of C++ headers, GCCXML produces an  XML file that contains 
a description of all classes/methods/functions/typedefs/enums etc. This 
XML file is not really human readable and may be huge (upon 20Mb),
- pygccxml reads this XML file and allow an access to the information 
with Python. With gccxml, you can for instance easily get the list of 
classes that are defined in a set of C++ headers,
- pyplusplus is based on pygccxml and produces Boost/python C++ code 
that can be compiled to create a python wrapper. I gave up with 
Boost/Python after three months of use: it's a mess, each OpenCascade 
package require at least 2 days of full-time work. Knowing that 
OpenCascade is about 400 different packages, 400*2 = 800 days of work! 
In other words, ice of the Antarctic would have disappear before 
pythonOCC is released. SWIG is quite more simple to use and, most 
important, it's really fast to develop a small python wrapper. 
pyplusplus was then use to automatically generate, instead of Boost 
code, SWIG compliant code: it's the SWIG_generator.py script.


This is the end of the first Part of this thread. Next chapter will be 
dedicated to the process that go from an OpenCascade set of headers to 3 
SWIG files: a loop over the MODULES list, class/method detection, 
typedef and enums handling. I will also introduce you to an issue that 
is still opened, and that explains why a few methods defined in 
OpenCascade headers are not available in the pythonOCC wrapper.

Best Regards,

Thomas





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

Reply via email to