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

eryar

PipeCAD - Plant Piping Design Software.
RvmTranslator - Translate AVEVA RVM to OBJ, glTF, etc.
posts - 603, comments - 590, trackbacks - 0, articles - 0

PlaneGCS-平面幾何約束求解器用法

Posted on 2023-03-24 22:10 eryar 閱讀(1550) 評論(0)  編輯 收藏 引用 所屬分類: 2.OpenCASCADE

PlaneGCS-平面幾何約束求解器用法

eryar@163.com

1 Introduction

在傳統的機械設計軟件中,一般使用幾何約束求解器來畫草圖,再通過對草圖進行拉伸旋轉等生成特征實現建模功能。基于參數化歷史特征方式來建模的軟件繞不開幾何約束求解器,目前主流商用軟件一般使用西門子D-Cubed DCM及達索的CGM。開源世界也有兩款幾何約束求解器:SolveSpace和PlaneGCS。

PlaneGCS字面意思是平面幾何約束求解器,主要用于繪制二維草圖。因為PlaneGCS代碼相對清晰,功能簡單,只能處理平面幾何元素的約束,本文主要結合示例代碼介紹PlaneGCS的使用方法,在會用的基礎上去理解源碼的實現邏輯。

2 PlaneGCS

PlaneGCS主要包含三部分:

  • 幾何元素數據結構文件:h/Geo.cpp
  • 約束條件文件:h/Constraints.cpp
  • 約束求解實現文件:h/GCS.cpp

其中幾何元素數據結構中定義的幾何元素如下圖所示:

從上圖可以看到,目前支持的幾何元素有點Point,直線Line,圓Circle,橢圓Ellipse,雙曲線Hyperbola,拋物線Parabola,圓弧Arc/ArcOfEllipse/ArcOfHyperbola/ArcOfParabola,及B樣條曲線BSpline,不過看代碼BSpline部分函數沒有實現,應該是不支持的。

約束條件文件定義的約束類型如下圖所示:

從約束求解文件中可以看到,其中數學計算主要使用Eigen中非線性方程組求解算法和boost的圖graph算法,從中可以推測出實現平面幾何約束求解器中需要的關鍵技術。先掌握PlaneGCS的用法,然后再分析其背后的實現原理細節。

3 Code Example

這里給出一個簡單的示例程序,先讓大家對PlaneGCS有個認識。示例程序中演示了給兩條直線加上水平和垂直約束。為了便于查看約束后的結果,在代碼中生成Draw Test Harness腳本文件。

程序代碼如下所示:

/*
Copyright(C) 2023 Shing Liu(eryar@163.com)
Permission is hereby granted, free of charge, to any person obtaining a copy
of this software and associated documentation files(the "Software"), to deal
in the Software without restriction, including without limitation the rights
to use, copy, modify, merge, publish, distribute, sublicense, and / or sell
copies of the Software, and to permit persons to whom the Software is
furnished to do so, subject to the following conditions :
The above copyright notice and this permission notice shall be included in all
copies or substantial portions of the Software.
THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT.IN NO EVENT SHALL THE
AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE
SOFTWARE.
*/
#include "GCS.h"
#include <fstream>
void test()
{
    double aPx1 = 0.0;
    double aPy1 = 0.0;
    double aPx2 = 3.0;
    double aPy2 = 3.0;
    double aPx3 = 6.0;
    double aPy3 = 9.0;
    GCS::VEC_pD aParameters;
    aParameters.push_back(&aPx1);
    aParameters.push_back(&aPy1);
    aParameters.push_back(&aPx2);
    aParameters.push_back(&aPy2);
    aParameters.push_back(&aPx3);
    aParameters.push_back(&aPy3);
    GCS::Point aP1(&aPx1, &aPy1);
    GCS::Point aP2(&aPx2, &aPy2);
    GCS::Point aP3(&aPx3, &aPy3);
    GCS::Line aLine1;
    GCS::Line aLine2;
    aLine1.p1 = aP1;
    aLine1.p2 = aP2;
    aLine2.p1 = aP2;
    aLine2.p2 = aP3;
    std::ofstream aTclFile("d:/gcs.tcl");
    aTclFile << "# 2 lines before PlaneGCS solve" << std::endl;
    aTclFile << "vinit" << std::endl;
    aTclFile << "vertex aP1 " << aPx1 << " " << aPy1 << " 0" << std::endl;
    aTclFile << "vertex aP2 " << aPx2 << " " << aPy2 << " 0" << std::endl;
    aTclFile << "vertex aP3 " << aPx3 << " " << aPy3 << " 0" << std::endl;
    aTclFile << "polyvertex aPolyline1 aP1 aP2 aP3" << std::endl;
    aTclFile << "vdisplay aPolyline1 " << std::endl;
    aTclFile << "vsetcolor aPolyline1 RED" << std::endl;
    GCS::System aSolver;
    aSolver.addConstraintHorizontal(aLine1);
    aSolver.addConstraintVertical(aLine2);
    if (aSolver.solve(aParameters) == GCS::Success)
    {
        aSolver.applySolution();
        aTclFile << "# 2 lines after PlaneGCS solve" << std::endl;
        aTclFile << "vertex aV1 " << aPx1 << " " << aPy1 << " 0" << std::endl;
        aTclFile << "vertex aV2 " << aPx2 << " " << aPy2 << " 0" << std::endl;
        aTclFile << "vertex aV3 " << aPx3 << " " << aPy3 << " 0" << std::endl;
        aTclFile << "polyvertex aPolyline2 aV1 aV2 aV3" << std::endl;
        aTclFile << "vdisplay aPolyline2 " << std::endl;
        aTclFile << "vsetcolor aPolyline2 GREEN" << std::endl;
    }
    aTclFile.close();
}
int main(int argc, char* argv[])
{
    test();
    return 0;
}

從程序代碼中可以看出PlaneGCS的使用先要定義需要計算的參數aParameters,這些參數是幾何元素中的數據,都是使用的指針。然后將約束加入到GCS::System中,最后代入參數調用solve函數進行求解。求解成功后使用applySolution()函數應用求解結果。求解結果在Draw中顯示的綠色的線如下圖所示:

4 Conclusion

本文結合示例代碼演示如何使用PlaneGCS,主要使用了水平和垂直約束。PlaneGCS中還支持其他約束類型,童鞋們可以自己探索一下。幾何造型內核和幾何約束求解器常被看作是工業CAD軟件的卡脖子技術,開源庫一般功能不太完善,但是用來探索背后的實現原理還是有參考借鑒意義的。希望有更多的童鞋去了解背后的原理,共同來提高國內三維CAD軟件開發水平。

青青草原综合久久大伊人导航_色综合久久天天综合_日日噜噜夜夜狠狠久久丁香五月_热久久这里只有精品
  • <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>
            日韩一级大片在线| 欧美v国产在线一区二区三区| 亚洲国产专区校园欧美| 欧美一级大片在线观看| 久久精品99国产精品| 国产精品久久久999| 午夜老司机精品| 欧美国产日产韩国视频| 午夜精品www| 136国产福利精品导航| 欧美日本视频在线| 久久精品亚洲| 一本色道久久综合亚洲精品婷婷| 久久久99久久精品女同性| 亚洲精选久久| 国产午夜精品视频免费不卡69堂| 免费成人黄色| 久久99在线观看| 亚洲小说欧美另类社区| 亚洲国产日韩欧美| 亚洲视频 欧洲视频| 国产一区二区三区在线免费观看| 久久精品30| 亚洲香蕉网站| 亚洲永久字幕| 一个色综合导航| 亚洲欧美国产高清va在线播| 亚洲精品欧美激情| 亚洲丰满少妇videoshd| 久久se精品一区精品二区| 亚洲美女电影在线| 午夜精品久久久久久久99黑人| 欧美一区亚洲二区| 亚洲在线观看| 亚洲女同性videos| 亚洲视频欧美视频| 久久亚洲欧洲| 久久国产精品毛片| 亚洲人成网站在线播| 欧美激情一区二区三级高清视频 | 欧美日产国产成人免费图片| 久久久av水蜜桃| 欧美视频中文字幕| 国产精品久久久久9999高清| 含羞草久久爱69一区| 国产视频在线观看一区二区三区| 亚洲啪啪91| 亚洲精品乱码久久久久久黑人 | 一区二区三区欧美在线观看| 亚洲区在线播放| 久久久99国产精品免费| 一本色道久久综合狠狠躁篇怎么玩| 久久精品一区四区| 国产视频亚洲精品| 久久精品国产v日韩v亚洲| 99伊人成综合| 欧美一区二区三区免费大片| 欧美日韩国产探花| 日韩一区二区久久| 亚洲欧美综合国产精品一区| 亚洲电影免费观看高清| 久久动漫亚洲| 精品动漫3d一区二区三区| 亚洲精品少妇网址| 欧美激情免费在线| 欧美va日韩va| 国产精品久久97| 在线亚洲美日韩| 日韩午夜剧场| 国产精品久久久久久久电影| 亚洲一级二级在线| 久久久噜噜噜久噜久久| 嫩模写真一区二区三区三州| 亚洲国产欧美一区二区三区丁香婷| 欧美在线日韩精品| 国产欧美日韩精品在线| 亚洲日本免费| 亚洲国产专区校园欧美| 欧美久久久久久久久久| 亚洲视频中文| 亚洲男人av电影| 国产日韩综合| 欧美aⅴ99久久黑人专区| 女人香蕉久久**毛片精品| 99成人在线| 亚洲桃色在线一区| 黄色成人在线| 亚洲黄色在线看| 久久精品午夜| 亚洲欧洲在线一区| 亚洲视频视频在线| 欧美理论在线播放| 亚洲午夜视频在线| 欧美一区二区在线免费观看 | 日韩一级欧洲| 亚洲欧美国产另类| 亚洲国产成人tv| 久久激情视频免费观看| 久久久欧美一区二区| 国产精品一二三视频| 亚洲精品资源| 亚洲欧美久久久| 亚洲国产日本| 亚洲欧美日韩国产中文在线| 国产精品久久7| 久久一区亚洲| 欧美日韩一区二区视频在线| 亚洲美女视频网| 亚洲欧美成人| 99精品国产高清一区二区| 性xx色xx综合久久久xx| 日韩亚洲欧美一区| 久久久精品五月天| 欧美一级专区免费大片| 欧美—级a级欧美特级ar全黄| 亚洲国产精品一区在线观看不卡| 亚洲国产精品视频| 国产一区二区成人| 一区二区三区波多野结衣在线观看| 韩国av一区| 亚洲欧美一区二区激情| 一本色道久久| 亚洲午夜在线观看视频在线| 在线日韩电影| 欧美一区二区在线观看| 亚洲欧美国产视频| 欧美精品一二三| 欧美韩国一区| 激情久久久久久| 亚洲欧美资源在线| 亚洲欧美成人一区二区三区| 欧美大片免费看| 亚洲男人第一av网站| 欧美bbbxxxxx| 欧美国产日韩一区| 亚洲午夜在线视频| 亚洲一区在线播放| 一区二区三区日韩精品| 欧美www在线| 欧美国产一区二区| 亚洲高清资源综合久久精品| 欧美在线视频二区| 久久综合狠狠| 在线免费观看成人网| 欧美中文字幕第一页| 久久久久久久激情视频| 国产一区二区三区在线观看免费 | 久久久久成人网| 国产亚洲二区| 久久精品在线| 欧美国产高潮xxxx1819| 欧美电影免费观看高清完整版| 久久另类ts人妖一区二区| 国产一区二区成人| 久久综合中文字幕| 亚洲免费在线视频| 国产精品久久毛片a| 久久深夜福利| 精品电影在线观看| 欧美h视频在线| 洋洋av久久久久久久一区| 亚洲影院污污.| 国产欧美在线视频| 久久色中文字幕| 久久久精品国产99久久精品芒果| 国产欧美一区二区视频| 久久福利视频导航| 麻豆91精品| 国产欧美大片| 久久久久国产精品麻豆ai换脸| 欧美成人精品在线播放| 野花国产精品入口| 国产精品拍天天在线| 亚洲青涩在线| 午夜精品久久久久久久白皮肤| 国产一区二区三区久久悠悠色av| 老司机一区二区| 亚洲午夜一二三区视频| 免播放器亚洲| 国外视频精品毛片| 欧美国产日韩一区二区三区| 男女视频一区二区| 一区二区三区毛片| 国内精品久久久久久影视8| 亚洲欧美另类在线| 欧美成人在线免费观看| 午夜精品久久久久久99热| 亚洲国产精品ⅴa在线观看 | 欧美刺激午夜性久久久久久久| 99精品国产热久久91蜜凸| 久久色在线观看| 亚洲欧美在线看| 亚洲美女免费视频| 国内精品久久久久伊人av| 国产精品va在线| 亚洲一区二区视频在线| 欧美福利视频一区| 久久精品国产亚洲一区二区三区 | 亚洲欧美日韩精品| 在线观看一区欧美|