青青草原综合久久大伊人导航_色综合久久天天综合_日日噜噜夜夜狠狠久久丁香五月_热久久这里只有精品

eryar

PipeCAD - Plant Piping Design Software.
PlantAssistant - Translate AVEVA RVM/SP3D VUE to glTF, STEP, etc.
posts - 606, comments - 590, trackbacks - 0, articles - 0

Evaluate Math Expression

Posted on 2013-10-09 23:38 eryar 閱讀(4735) 評論(0)  編輯 收藏 引用 所屬分類: 2.OpenCASCADE4.AVEVA Solution

Evaluate Math Expression

eryar@163.com

摘要Abstract:本文簡要介紹了數學表達式解析求值的幾款開源軟件,并結合程序代碼說明了OpenCascade中表達式包的用法。也簡要介紹了表達式解析求值在AVEVA Paragon模塊中的應用。

關鍵字Key Words:Expression, Paragon, OpenCascade Expr package, muParser, MTParser

一、引言 Introduction

算術表達式中最常見的表示法形式有中綴、前綴和后綴表示法。中綴表示法(Infix notation)是書寫表達式的常見方式,而前綴(prefix notation)、后綴表示法(postfix notation)主要用于計算機科學領域。算術表達式只包含操作數(operands)、二元操作符(binary operators)和一種括號(one kind of parentheses)。

Knuth將編寫程序計算表達式的方法概括為三個步驟:

l 對中綴表達式進行語法分析;

l 中綴表達式到后綴表達式的轉換;

l 對后綴表達式求值;

在《數據結構與算法》等相關的書籍中,還有如何將中綴表達式轉換為后綴表達式的具體算法。

在AVEAV Plant(PDMS)的Paragon模塊定義部件時,使用了參數化的表達式,從而實現了參數化的部件定義。其中參數化表達式的解析計算是其一個關鍵技術點。最近在寫模型導出程序(Model Data Exchange Addin)時就遇到了這個問題,即參數化表達式的計算。好在AVEVA .Net給出了表達式計算類DbExpression,可以對PML的表達式進行解析計算,順利解決了問題。

若想在自己的程序中實現數學表達式的解析求值,也有一些開源的工具可供選用。有些C++的數學表達式計算程序速度、效率還是很高的。在查看OpenCascade的文檔時,發現其也有表達式求值的包,可用來對表達式進行計算。

發現OpenCascade已經有很多功能與AVEVA產品PDMS中的功能很類似,也難怪OpenCascade的前身Matra-Data Vision公司早期也有個集機械設計與工廠設計于一身的企業級并行工程解決方案Euclid集成系統。在1998年時Dassault Systèmes收購了EUCLID QUANTUM。

二、幾款開源軟件介紹 Introduce some tools

網上有很多開源的數學表達式解析求值的庫,如:

l fparser

l muParser

l MTParse

在開源的二維CAD軟件LibreCAD中就使用了muParser來對輸入命令中的表達式進行解析。早期版本中使用了fparser。muParser小巧精干,提供LIB、DLL及源代碼入方式。muParser最大的優點就是速度較快,更適合于實時性要求較高的環境,如Unix系統和單片機環境。源程序下載及文檔說明可參考:

http://www.codeproject.com/cpp/FastMathParser.asp

MTParser優雅簡潔,提供LIB、COM、源代碼三種引入方式,是用典型C++風格編寫的解析器,和muParser不同,它引入了多種設計模式,因而可擴展性的可維護性都很強。如作者所說,速度并不是TMParser最優先考慮的,也許文中所說的可擴展、可維護、易于使用、健壯性才是它的最大優勢。源程序下載及設計文檔可參考:

http://www.codeproject.com/Articles/7335/An-extensible-math-expression-parser-with-plug-ins

下面以一個具體實例來說明muParser的用法:(將muParser以源代碼引入的方式加入到項目中),再編譯如下代碼:

 

 1 /*
 2 *    Copyright (c) 2013 eryar All Rights Reserved.
 3 *
 4 *        File    : Main.cpp
 5 *        Author  : eryar@163.com
 6 *        Date    : 2013-10-09
 7 *        Version : 1.0v
 8 *
 9 *    Description : Evaluate expression in muParser.
10 *                  
11 */
12 
13 #include <iostream>
14 
15 #include "muParser.h"
16 
17 int main()
18 {
19     mu::Parser parser;
20     parser.DefineNameChars("0123456789_"
21                        "abcdefghijklmnopqrstuvwxyz"
22                        "ABCDEFGHIJKLMNOPQRSTUVWXYZ"
23                        "[]");
24 
25     double dParam1 = 2.0;
26     double dParam2 = 3.1415926 / 2.0;
27 
28     parser.DefineVar("PARA[1]"&dParam1);
29     parser.DefineVar("PARA[2]"&dParam2);
30 
31     parser.SetExpr("10 * (PARA[1] + sin(PARA[2]))");
32 
33     std::cout << parser.Eval() << std::endl;
34 
35 }

程序運行結果如下所示:

1 30 
2 Press any key to continue . . . 

如上程序所示,使用muParser可實現參數化表達式的計算,功能與AVEVA Plant(PDMS)中的Paragon模塊中參數化表達式的計算方式已經很相近了。使用方法很簡單。

三、Evaluate Expression in OpenCascade

在OpenCascade的TKAdvTools中有Expr包和ExprIntrp包,這兩個包可用來對表達式進行解析和求值。但是在其文檔《Foundation Classes User’s Guide》中并沒有對TKAdvTools的工具進行說明。下面只給出一個簡單實例來說明其應用,有興趣的讀者可以結合源程序對其具體實現進行研究。示例代碼如下所示:

 

 1 /*
 2 *    Copyright (c) 2013 eryar All Rights Reserved.
 3 *
 4 *        File    : Main.cpp
 5 *        Author  : eryar@163.com
 6 *        Date    : 2013-10-09
 7 *        Version : 1.0v
 8 *
 9 *    Description : Evaluate expression in OpenCascade.
10 *                  
11 */
12 
13 #define WNT
14 #include <TCollection_AsciiString.hxx>
15 #include <Expr_GeneralExpression.hxx>
16 #include <ExprIntrp_GenExp.hxx>
17 
18 #pragma comment(lib, "TKernel.lib")
19 #pragma comment(lib, "TKAdvTools.lib")
20 
21 int main(void)
22 {
23     TCollection_AsciiString strExpr("sin(3.1415926 / 6) * 2");
24     Handle_ExprIntrp_GenExp exprIntrp = ExprIntrp_GenExp::Create();
25     Handle_Expr_GeneralExpression genExpr = NULL;
26 
27     exprIntrp->Process(strExpr);
28 
29     genExpr = exprIntrp->Expression();
30 
31     std::cout << genExpr->EvaluateNumeric() << std::endl;
32 
33     return 0;
34 }

程序運行結果如下所示:

1 1 
2 Press any key to continue . . . 

OpenCascade的表達式求值功能也很強大,這里只以一個簡單示例來拋磚引玉啦。感覺OpenCascade的表達式包也可以像muParser, MTParser一樣作為一個獨立的工具來使用。

四、結論 Conclusion

因為AVEVA Plant(PDMS)的Paragon模塊中的參數化部件定義方式,注意到了參數表達式的解析與求值。由于ModelDataExchangeAddin程序的需要,才去找尋開源的表達式解析與求值的庫,誰知最后還是使用了AVEVA .Net中現成的DbExpression類,簡化了程序的開發。

OpenCascade中竟然也有表達式解析與求值的工具,作為早期機械設計與工廠設計軟件系統,可能都考慮過參數化這種方式。深入挖掘其源代碼,對類似PDMS的工廠設計系統實現原理的理解有很大幫助。

五、參考資料 Bibliography

1. http://www.ibm.com/developerworks/cn/java/j-w3eva/

2. http://en.wikipedia.org/wiki/Euclid_(computer_program)

 

青青草原综合久久大伊人导航_色综合久久天天综合_日日噜噜夜夜狠狠久久丁香五月_热久久这里只有精品
  • <ins id="pjuwb"></ins>
    <blockquote id="pjuwb"><pre id="pjuwb"></pre></blockquote>
    <noscript id="pjuwb"></noscript>
          <sup id="pjuwb"><pre id="pjuwb"></pre></sup>
            <dd id="pjuwb"></dd>
            <abbr id="pjuwb"></abbr>
            久久久一二三| 欧美77777| 国产精品素人视频| 欧美日韩精品综合| 欧美精品少妇一区二区三区| 欧美影院成年免费版| 欧美亚洲在线| 久久夜色精品| 欧美精品情趣视频| 欧美亚日韩国产aⅴ精品中极品| 欧美日韩理论| 国产精品专区第二| 1769国产精品| 日韩一级黄色片| 亚洲网站在线播放| 欧美在线视频在线播放完整版免费观看| 亚洲欧美日韩国产一区| 久久久精品欧美丰满| 欧美成人第一页| 欧美成人亚洲| 国产精品一二一区| 欧美www视频| 国产精品久久久久天堂| 国产自产高清不卡| 亚洲国产一区视频| 亚洲一区欧美一区| 美女视频黄 久久| 亚洲精品日韩综合观看成人91 | 快射av在线播放一区| 亚洲国产合集| 亚洲小少妇裸体bbw| 久久精品1区| 欧美日韩一本到| 在线免费观看视频一区| 亚洲一区二区在线| 欧美成人第一页| 亚洲欧美一级二级三级| 欧美黄色影院| 精品999在线播放| 亚洲男人av电影| 亚洲日本乱码在线观看| 久久精品视频免费播放| 国产精品推荐精品| 一区二区三区四区五区精品视频| 玖玖国产精品视频| 香蕉久久夜色精品国产使用方法| 欧美韩日一区二区| 在线观看一区视频| 久久国产日韩| 亚洲一区www| 欧美网站在线观看| aa级大片欧美三级| 日韩视频三区| 欧美日韩在线不卡| 亚洲午夜一区二区三区| 亚洲精品一区久久久久久| 欧美激情导航| 日韩一区二区精品视频| 亚洲国产欧美在线| 欧美精品一区二区三区蜜臀| 亚洲精品国精品久久99热| 欧美夫妇交换俱乐部在线观看| 久久爱www.| 亚洲成人在线视频网站| 欧美国产日韩在线观看| 欧美成人高清| 在线视频精品一区| 亚洲午夜精品一区二区| 国产精品欧美一区二区三区奶水| 午夜精彩国产免费不卡不顿大片| 一区二区三区四区国产| 欧美日韩一二三区| 亚洲一区二区动漫| 亚洲制服欧美中文字幕中文字幕| 国产精品久久国产精品99gif| 日韩小视频在线观看专区| 亚洲第一区在线| 久久婷婷亚洲| 午夜精品久久久久久久久久久久| 久久视频国产精品免费视频在线| 一区二区三区四区五区精品视频| 欧美成人黑人xx视频免费观看| 国产亚洲精品久久久| 久久久国产精品一区| 久久aⅴ乱码一区二区三区| 国产在线麻豆精品观看| 久久精品国产欧美激情| 欧美一区二区网站| 精品白丝av| 欧美成人精品一区二区三区| 久久久伊人欧美| 国产精品一区二区视频| 久久综合久久综合久久| 久久久久国色av免费看影院| 亚洲高清一二三区| 最新国产の精品合集bt伙计| 欧美日本高清视频| 欧美亚洲视频一区二区| 久久激情五月激情| 国产乱理伦片在线观看夜一区| 欧美国产日韩精品| 欧美精品国产一区| 午夜精品www| 久久精品免费| 99精品国产一区二区青青牛奶 | 在线免费观看一区二区三区| 性欧美长视频| 欧美激情视频一区二区三区在线播放 | 91久久中文字幕| 日韩视频在线一区二区| 国产精品永久在线| 欧美激情综合| 欧美激情一区在线观看| 久久中文字幕一区二区三区| 欧美插天视频在线播放| 亚洲欧美另类国产| 噜噜噜91成人网| 欧美亚洲视频在线看网址| 免费日本视频一区| 久久成人亚洲| 国产日韩欧美一区二区| 亚洲欧洲日本在线| 狠狠久久五月精品中文字幕| 99re8这里有精品热视频免费 | 亚洲人成在线播放网站岛国| 宅男噜噜噜66一区二区| 在线观看亚洲精品| 最近中文字幕日韩精品 | 国产精品每日更新| 欧美激情精品久久久久久| 久久久噜噜噜久久| 欧美亚洲视频在线看网址| 亚洲茄子视频| 欧美一级淫片播放口| 中文精品视频| 欧美成人一区二免费视频软件| 欧美在线一二三四区| 久久九九精品| 欧美 日韩 国产在线| 国产一区二区看久久| 亚洲天堂久久| 一本色道久久综合| 牛牛精品成人免费视频| 久久一二三国产| 国产喷白浆一区二区三区| 巨乳诱惑日韩免费av| 国产亚洲人成a一在线v站| 亚洲欧美日韩精品在线| 亚洲永久在线观看| 欧美日韩一区二区三区| 亚洲人成亚洲人成在线观看图片 | 欧美日韩三区| 亚洲日本一区二区三区| 亚洲国产婷婷香蕉久久久久久| 久久久久免费视频| 蜜臀a∨国产成人精品| 国内精品视频一区| 亚洲主播在线观看| 亚洲欧美制服中文字幕| 国产精品看片资源| 亚洲一区二区三区午夜| 午夜免费在线观看精品视频| 国产精品国产亚洲精品看不卡15 | 狠色狠色综合久久| 久久久久久尹人网香蕉| 女女同性精品视频| 亚洲精选成人| 欧美日韩中文在线观看| 亚洲欧美日韩国产一区二区| 久久精品99| 亚洲高清在线观看| 欧美激情二区三区| 99精品福利视频| 亚洲欧美电影在线观看| 国产婷婷97碰碰久久人人蜜臀| 欧美一区二区在线免费观看| 久久夜色精品国产亚洲aⅴ| 亚洲日本中文字幕区| 国产精品va| 久久九九99| 亚洲精品久久久久久一区二区 | 亚洲天堂激情| 国产精品有限公司| 久久男人资源视频| 亚洲精品一区二区在线| 亚洲一区二区在线视频| 国产一区二区三区四区| 免费成人av在线看| 日韩亚洲视频| 毛片av中文字幕一区二区| 亚洲国产精品一区在线观看不卡 | 亚洲视频在线一区| 久久久www免费人成黑人精品 | 亚洲人成毛片在线播放| 亚洲男人第一av网站| 一区二区在线视频观看| 欧美日韩亚洲一区二区| 亚洲午夜高清视频| 亚洲毛片在线看| 国产亚洲欧美一区|