Gents,

Just want to express my support regarding these activities! Great, great work!





2009/7/5 Thomas Paviot <tpav...@gmail.com>:
> 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...@gmail.com)
> ##
> ##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

Reply via email to