Hi Pierre, The parametric framework has been made interoperable with other packages by adding two callbacks: - a 'pre-solver' callback, which is called before the geometric solver is called; - a 'post-solver' callback, which is called just after the new geometry is solved.
You can register as many functions as you want into these callbacks. You can get the current state of the TopoDS_Shape. An example of how to use both parametric and meshing frameworks using callbacks is available at: http://code.google.com/p/pythonocc/source/browse/trunk/src/examples/Level2/PAF/paf_smesh.py The most important line of this example is the line 118: my_context.register_post_solver_callback(mesh_and_display) The 'mesh_and_display' function will be called each time a parameter is changed. Best Regards, Thomas 2010/7/6 Pierre JUILLARD <pierre.juill...@gmail.com> > > Dear all, > > May I know what is the current status of the pythonOCC parametric > framework? > I have read in this email last year that it was a hard work going on, and > that the next step would be to link this framework with solvers (constraint > programming, evolutionary computing etc.). > May I know if this step has begun, and if some constraint solvers have been > evaluated? > > Thanks in advance for the news. > > Bests, > > Pierre > > > > > Posted by *Thomas Paviot* on July 05, 2009 - 10:36: > Hi all, > > Based on the SalomeGEOM library, which was included a few weeks ago in > pythonOCC (see the subversion trunk), a pure python prametric framework is > currently being (actively) developped. > > This parametric framework is based on four main classes: > - the Parameter class: creation of parameters, > - the Facotry class: creation of geometry based on the parameters, > - the Rule class: enable to attach one or more rules to a Parameter. The > rule consists of a function that returns a boolean: True if the rule is > validated, false otherwise, > - the Relation class: create relations between parameters. This class is > based on sympy (http://code.google.com/p/sympy/), a Python library for > symbolic mathematics. > > Then, each time a parameter is changed (which can be done from a ipython > -wthread interactive console): > - the new values of parameters are computed according to the different > Relations that have been set up, > - the Rules are checked. > > It's not finished yet, and the result has not yet been uploaded to the > subversion trunk, but it should be done in a few days (weeks?), once the API > is stable (it's still moving almost every day). It's mostly based on python > descriptors (http://users.rcn.com/python/download/Descriptor.htm), with an > intensive use of callbacks and operator overloading. Of course, thanks to > the magic of Python, this framework is currently only 500 lines of > pythoncode. > > Although it's not available yet, here is a small sample I made, called the > 'gears' sample. The diameter of the gears and the relative position are > driven by two parameters: the velocity ratio (r) and the distance between > axis (a). Every change in those parameters modifies the geometry in > consequence, if the rules are validated. The syntax could change in the > future, but the architecture is defined and should be stable. > > The work that still have to be done: > - simplify the API (there's still a possible confusion with the handle of > parameters by strings "p.X" or attributes p.X), > - check the stability of the API, in case, for instance, of cyclic > references between parameters, > - and, in a mid term, link this framework with solvers (constraint > programming, evolutionary computing etc.) in order to find solutions to > engineering problems as defined by the (Rules,Relations). > > Of course, I'll let you know about the future developments of this project. > > Best Regards, > > Thomas > > ##Copyright 2009 Thomas Paviot (tpav...@xxxxxxxxx) > ## > ##This file is part of pythonOCC. > ## > ##pythonOCC is free software: you can redistribute it and/or modify > ##it under the terms of the GNU General Public License as published by > ##the Free Software Foundation, either version 3 of the License, or > ##(at your option) any later version. > ## > ##pythonOCC is distributed in the hope that it will be useful, > ##but WITHOUT ANY WARRANTY; without even the implied warranty of > ##MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the > ##GNU General Public License for more details. > ## > ##You should have received a copy of the GNU General Public License > ##along with pythonOCC. If not, see <http://www.gnu.org/licenses/>. > > # A sample that shows how to generate the gear geometry according > # to knowledge > > from Context import Context > import Parametric > from Parametric import Parameters, symb, Relation > import Factory > import Presentation > from math import pi > from sympy import * > > # > # Initialization > # > my_context = Context() > my_context.Init() > my_presentation = Presentation.Presentation(my_context) > p = Parameters(my_context) > p.register_callback(my_presentation.update) #tells that viewer should be > updated after each parameter modification > my_factory = Factory.Factory(my_context) > > # > # Define the first gear (actually modelized by a cylinder) > # > > # location of the first gear > p.X1 = 0.0 > p.Y1 = 0.0 > p.Z1 = 0.0 > my_pnt1 = my_factory.PointXYZ(p.X1,p.Y1,p.Z1,"Pnt1") > # Direction of the gear > p.DX1 = 0.0 > p.DY1 = 0.0 > p.DZ1 = 1.0 > my_vec1 = my_factory.VectorDXDYDZ(p.DX1,p.DY1,p.DZ1,"Vec1") > # Parameters of the cylinder > p.R1 = 50.0 #radius > p.H1 = 20.0 #height > p.Angle1 = 0.0 > gear1 = > my_factory.CylinderPntVecRH(my_pnt1,my_vec1,p.R1,p.H1,p.Angle1,"Gear1") > > # > # Define the second gear (actually also modelized by a cylinder) > # > > # location of the second gear > p.X2 = 100 > p.Y2 = 0.0 > p.Z2 = 0.0 > my_pnt2 = my_factory.PointXYZ(p.X2,p.Y2,p.Z2,"Pnt2") > # Direction of the second gear > p.DX2 = 0.0 > p.DY2 = 0.0 > p.DZ2 = 1.0 > my_vec2 = my_factory.VectorDXDYDZ(p.DX2,p.DY2,p.DZ2,"Vec2") > # Parameters of the second cylinder > p.R2 = 70.0 #radius > p.H2 = 20.0 #height > p.Angle2 = 0.0 > gear2 = > my_factory.CylinderPntVecRH(my_pnt2,my_vec2,p.R2,p.H2,p.Angle2,"Gear2") > > # Displays gears > my_presentation.register_object(gear1) > my_presentation.register_object(gear2,color=1) > > # Define the parameters that drive the design of the gears > p.m = 2 #the gear modulus > p.a= 100 # the distance between gears axis > # Other parameters of the gears that it's good to know about > p.Z1 = 1 #unknown for the moment, the parameter is just created > p.Z2 = 1 # number of teeth, unknown for the moment > p.r = 0.5 # The speed ratio > > def DefineRules(): > # The number of teeth must be greater than 0 and also be an integer > def CheckZ(Z): > return (int(Z)/Z==1.0 and Z>0) > R1 = Parametric.Rule(p,"Z1",CheckZ) > R2 = Parametric.Rule(p,"Z2",CheckZ) > # The modulus cannot take any value #notice that this list is not > exhaustive. > def Checkm(m): > return m in [0.06,0.08,0.1,1,1.25,1.5,2,2.5,3] > R3 = Parametric.Rule(p,"m",Checkm) > > def DefineRelations(): > # The three relations are: > # * d1 = 2a/(1+r) so R1=a/(1+r) (Rel1) > # * d2 = 2ar(1+r) so R2 = ar/(1+r) (Rel2) > # * p.X2 = p.X1 + p.a (Rel3) > # define a sympy relation based on one parameter > r = symb(p.r) > a = symb(p.a) > X1 = symb(p.X1) > Rel1 = a/(1+r) > Rel2 = a*r/(1+r) > Rel3 = X1 + a > Relation(p,"R1",Rel1) > Relation(p,"R2",Rel2) > Relation(p,"X2",Rel3) > > DefineRules() > DefineRelations() > > > _______________________________________________ > 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