Units of user defined equation in FEM result

About the development of the FEM module/workbench.

Moderator: bernd

UR_
Veteran
Posts: 1355
Joined: Tue Jan 03, 2017 8:42 pm

Re: Units of user defined equation in FEM result

Post by UR_ »

Just tried the new parser


version:
OS: Windows 10 (10.0)
Word size of OS: 64-bit
Word size of FreeCAD: 64-bit
Version: 0.19.19677 (Git)
Build type: Release
Branch: master
Hash: e3b5b0b177dcdf4be3cdd4169010cad2e2bdd574
Python version: 3.8.1
Qt version: 5.12.5
Coin version: 4.0.0
OCC version: 7.4.0
Locale: German/Germany (de_DE)



Nice, but completely useless :?

Only basic arithmetic operations (+,-,*,/) ??? :cry:

At least we need ** for squaring and np.sqrt() for root.

Just a first try to implement EXP leads to this error message:

Syntax error at '**'
2
Traceback (most recent call last):
File "C:\Users\aio\Miniconda3\envs\freecad\Library\Mod\Fem\femguiobjects\_ViewProviderFemResultMechanical.py", line 533, in calculate
UserDefinedFormula = tokrules.names["UserDefinedFormula"].tolist()
KeyError: 'UserDefinedFormula'

using this shorty:
T**2


But what's wrong with this:

Code: Select all

# ***************************************************************************
# *   Copyright (c) 2020 Werner Mayer <wmayer[at]users.sourceforge.net>     *
# *                                                                         *
# *   This program is free software; you can redistribute it and/or modify  *
# *   it under the terms of the GNU Lesser General Public License (LGPL)    *
# *   as published by the Free Software Foundation; either version 2 of     *
# *   the License, or (at your option) any later version.                   *
# *   for detail see the LICENCE text file.                                 *
# *                                                                         *
# *   This program 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 Library General Public License for more details.                  *
# *                                                                         *
# *   You should have received a copy of the GNU Library General Public     *
# *   License along with this program; if not, write to the Free Software   *
# *   Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA  02111-1307  *
# *   USA                                                                   *
# *                                                                         *
# ***************************************************************************

__title__ = "FEM Utilities"
__author__ = "Werner Mayer"
__url__ = "http://www.freecadweb.org"

tokens = (
    'NAME',
    'FLOAT',
    'INT',
    'PLUS',
    'MINUS',
    'TIMES',
    'DIVIDE',
    'EQUALS',
    'LPAREN',
    'RPAREN',
    'COMMENT',
    'EXP',
)

# Tokens

t_PLUS    = r'\+'
t_MINUS   = r'-'
t_TIMES   = r'\*'
t_DIVIDE  = r'/'
t_EQUALS  = r'='
t_LPAREN  = r'\('
t_RPAREN  = r'\)'
t_NAME    = r'[a-zA-Z_][a-zA-Z0-9_]*'
t_EXP     = r'\*\*'


def t_FLOAT(t):
    r'\d+\.(\d+)?([eE][-+]?\d+)?'
    t.value = float(t.value)
    return t


def t_INT(t):
    r'\d+'
    t.value = int(t.value)
    return t


# Ignored characters
t_ignore = " \t"


def t_COMMENT(t):
    r'\#.*'
    pass


def t_newline(t):
    r'\n+'
    t.lexer.lineno += t.value.count("\n")


def t_error(t):
    print("Illegal character '%s'" % t.value[0])
    t.lexer.skip(1)


# Build the lexer
import ply.lex as lex
lex.lex()


# Precedence rules for the arithmetic operators
precedence = (
    ('left', 'PLUS', 'MINUS'),
    ('left', 'TIMES', 'DIVIDE'),
    ('left', 'EXP'),
    ('right', 'UMINUS'),
)

# dictionary of names (for storing variables)
names = {}


def p_statement_assign(p):
    'statement : NAME EQUALS expression'
    names[p[1]] = p[3]


def p_statement_expr(p):
    'statement : expression'
    print(p[1])


def p_expression_binop(p):
    '''expression : expression PLUS expression
                  | expression MINUS expression
                  | expression TIMES expression
                  | expression DIVIDE expression'''
    if p[2] == '+'  : p[0] = p[1] + p[3]
    elif p[2] == '-': p[0] = p[1] - p[3]
    elif p[2] == '*': p[0] = p[1] * p[3]
    elif p[2] == '/': p[0] = p[1] / p[3]
    elif p[2] == '**': p[0] = p[1] ** p[3]


def p_expression_uminus(p):
    'expression : MINUS expression %prec UMINUS'
    p[0] = -p[2]


def p_expression_group(p):
    'expression : LPAREN expression RPAREN'
    p[0] = p[2]


def p_expression_float(p):
    'expression : FLOAT'
    p[0] = p[1]


def p_expression_int(p):
    'expression : INT'
    p[0] = p[1]


def p_expression_name(p):
    'expression : NAME'
    try:
        p[0] = names[p[1]]
    except LookupError:
        print("Undefined name '%s'" % p[1])
        p[0] = 0


def p_error(p):
    print("Syntax error at '%s'" % p.value)


import ply.yacc as yacc
yacc.yacc()
reox
Posts: 929
Joined: Sat Aug 13, 2016 10:06 am
Contact:

Re: Units of user defined equation in FEM result

Post by reox »

UR_ wrote: Thu Feb 20, 2020 10:18 am At least we need ** for squaring and np.sqrt() for root.
exponents should be enough, you can always use **0.5 ;)
User avatar
Kunda1
Veteran
Posts: 13434
Joined: Thu Jan 05, 2017 9:03 pm

Re: Units of user defined equation in FEM result

Post by Kunda1 »

x-posting issue #4840: parsetab.py not created as part of installation
back to this forum thread.
Alone you go faster. Together we go farther
Please mark thread [Solved]
Want to contribute back to FC? Checkout:
'good first issues' | Open TODOs and FIXMEs | How to Help FreeCAD | How to report Bugs
User avatar
chennes
Veteran
Posts: 3914
Joined: Fri Dec 23, 2016 3:38 pm
Location: Norman, OK, USA
Contact:

Re: Units of user defined equation in FEM result

Post by chennes »

I've modified the OpenSCAD importer to use the output option @wmayer mentioned up topic. I'd be interested if the OP can now load CSG files.
Chris Hennes
Pioneer Library System
GitHub profile, LinkedIn profile, chrishennes.com
keithsloan52
Veteran
Posts: 2764
Joined: Mon Feb 27, 2012 5:31 pm

Re: Units of user defined equation in FEM result

Post by keithsloan52 »

reox wrote: Sat Feb 15, 2020 7:51 pm
wmayer wrote: Sat Feb 15, 2020 7:05 pm
WARNING: Couldn't open 'parser.out'. [Errno 13] Keine Berechtigung: '/usr/lib/freecad-daily/Mod/Fem/femtools/parser.out'
WARNING: Token 'COMMENT' defined, but not used
WARNING: There is 1 unused token
Generating LALR tables
WARNING: Couldn't create 'femtools.parsetab'. [Errno 13] Keine Berechtigung: '/usr/lib/freecad-daily/Mod/Fem/femtools/parsetab.py'
On my system I couldn't see that it wants to create such a file. I wonder what happens if you try to open an OpenSCAD file? Therefore ply is also used.
I converted some file to CSG and then I get this error message:

Code: Select all

WARNING: Token 'DOT' defined, but not used
WARNING: Token 'WORD' defined, but not used
WARNING: There are 2 unused tokens
WARNING: Couldn't create 'parsetab'. [Errno 13] Keine Berechtigung: '/usr/lib/freecad-daily/Mod/OpenSCAD/parsetab.py'
End processing CSG file
So this seems to be an issue with ply?
There is a bug in the OpenSCAD importer in that lex parses the info in importCSG.py and tries to write parsetab.py and if the filing system is read only the write fails, but this does not normally show up as a problem as the parsetab.py only changes if the definitions within importCSG.py change so it normally works with the version of parsetab.py that exists.
User avatar
chennes
Veteran
Posts: 3914
Joined: Fri Dec 23, 2016 3:38 pm
Location: Norman, OK, USA
Contact:

Re: Units of user defined equation in FEM result

Post by chennes »

That bug is fixed by git commit 2a79ce4bd.
Chris Hennes
Pioneer Library System
GitHub profile, LinkedIn profile, chrishennes.com
Post Reply