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

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 閱讀(1551) 評論(0)  編輯 收藏 引用 所屬分類: 2.OpenCASCADE

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

eryar@163.com

1 Introduction

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

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

2 PlaneGCS

PlaneGCS主要包含三部分:

  • 幾何元素數(shù)據(jù)結(jié)構(gòu)文件:h/Geo.cpp
  • 約束條件文件:h/Constraints.cpp
  • 約束求解實現(xiàn)文件:h/GCS.cpp

其中幾何元素數(shù)據(jù)結(jié)構(gòu)中定義的幾何元素如下圖所示:

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

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

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

3 Code Example

這里給出一個簡單的示例程序,先讓大家對PlaneGCS有個認(rèn)識。示例程序中演示了給兩條直線加上水平和垂直約束。為了便于查看約束后的結(jié)果,在代碼中生成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的使用先要定義需要計算的參數(shù)aParameters,這些參數(shù)是幾何元素中的數(shù)據(jù),都是使用的指針。然后將約束加入到GCS::System中,最后代入?yún)?shù)調(diào)用solve函數(shù)進(jìn)行求解。求解成功后使用applySolution()函數(shù)應(yīng)用求解結(jié)果。求解結(jié)果在Draw中顯示的綠色的線如下圖所示:

4 Conclusion

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

青青草原综合久久大伊人导航_色综合久久天天综合_日日噜噜夜夜狠狠久久丁香五月_热久久这里只有精品
  • <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>
            国产精品美女久久久久av超清 | 欧美日韩视频在线观看一区二区三区| 亚洲私人黄色宅男| 亚洲电影免费观看高清完整版在线观看 | 亚洲天堂网站在线观看视频| 亚洲精品国产视频| 亚洲精品欧美| 亚洲系列中文字幕| 性色一区二区| 久久人人精品| 欧美女人交a| 国产精品视频在线观看| 国产一区二区毛片| 亚洲第一区在线观看| 夜久久久久久| 欧美一级淫片aaaaaaa视频| 久久精品人人做人人爽电影蜜月| 麻豆精品视频在线观看视频| 亚洲精品一区二区三区樱花| 亚洲伊人一本大道中文字幕| 老司机久久99久久精品播放免费| 欧美—级a级欧美特级ar全黄| 国产精品sss| 亚洲国产小视频| 欧美一级久久久| 亚洲国产日韩一区| 久久经典综合| 欧美三级欧美一级| 激情懂色av一区av二区av| 在线视频亚洲一区| 美女视频黄免费的久久| 日韩亚洲精品电影| 久久人人爽爽爽人久久久| 欧美视频三区在线播放| 亚洲大片av| 久久国产视频网| 亚洲三级免费电影| 欧美在线1区| 一区二区三区黄色| 欧美中文字幕不卡| 亚洲一区视频在线观看视频| 久久久水蜜桃| 日韩亚洲视频| 免费永久网站黄欧美| 国产午夜精品麻豆| 一本久道久久综合婷婷鲸鱼| 欧美成人午夜激情| 亚洲欧美中文在线视频| 香蕉久久国产| 国产精品久久久久久一区二区三区 | 亚洲国产精品va| 久久久久久久一区二区三区| 亚洲午夜国产一区99re久久 | 在线精品国产欧美| 狠狠色丁香婷婷综合影院| 亚洲蜜桃精久久久久久久| 久久国产精品久久久久久| av不卡在线观看| 欧美日本精品| 99国产精品国产精品久久 | 亚洲第一区在线观看| 久久久水蜜桃| 久久综合狠狠综合久久综合88| 国产性色一区二区| 久久精品五月| 久久精选视频| 亚洲国产精品久久久久婷婷884 | 亚洲影视综合| 99精品国产在热久久婷婷| 欧美日本精品| 亚洲欧美日韩另类| 性欧美暴力猛交69hd| 国产一在线精品一区在线观看| 久久精品国亚洲| 久久久久久电影| 亚洲欧洲精品一区二区精品久久久| 牛牛影视久久网| 欧美金8天国| 性伦欧美刺激片在线观看| 午夜精品视频在线观看一区二区| 国产日韩欧美91| 欧美.www| 欧美天堂亚洲电影院在线观看| 亚洲欧美日韩精品| 午夜影视日本亚洲欧洲精品| 激情欧美丁香| 亚洲精品久久久蜜桃| 国产精品视频网址| 欧美va天堂| 欧美午夜在线一二页| 久久精品国产精品亚洲综合| 久久影音先锋| 亚洲免费在线看| 欧美在线亚洲| 亚洲天堂免费在线观看视频| 欧美在线视频免费播放| 亚洲久久成人| 久久久精品久久久久| 亚洲精品一区二区三区不| 亚洲一区在线免费观看| 亚洲国产精品成人| 亚洲综合电影一区二区三区| 91久久国产综合久久| 亚洲专区一二三| 日韩视频免费在线观看| 亚洲专区一区| 在线一区免费观看| 久久精品国产精品亚洲| 亚洲一区二区三区四区视频| 久久久久青草大香线综合精品| 久久综合国产精品台湾中文娱乐网| 欧美日韩福利视频| 久久全球大尺度高清视频| 欧美久久久久久久久| 久久久久久久999| 欧美日韩国产影院| 免费久久99精品国产| 国产精品久久久久国产a级| 亚洲成色777777女色窝| 国产一区二区高清| 一区二区免费在线观看| 亚洲毛片一区二区| 狼人天天伊人久久| 久久人人爽人人爽| 国产精品专区h在线观看| 亚洲精选91| 亚洲国产二区| 久久精品综合网| 欧美在线你懂的| 国产精品美女久久久久av超清 | 最新69国产成人精品视频免费| 亚洲综合首页| 亚洲欧美日韩一区二区三区在线| 欧美极品aⅴ影院| 亚洲国产精品v| 91久久中文| 欧美激情久久久久久| 亚洲国产另类久久久精品极度| 亚洲成人资源网| 久久久国产午夜精品| 免费一区二区三区| 亚洲激情电影在线| 欧美激情第8页| 一本一道久久综合狠狠老精东影业| 日韩午夜剧场| 欧美日韩高清区| 亚洲一二三区视频在线观看| 午夜精品视频在线| 国产亚洲精品资源在线26u| 一区二区三区精品久久久| 亚洲综合导航| 国产精品视频精品视频| 午夜一区不卡| 久久久久久久999精品视频| 久久综合久久综合九色| 亚洲精品国产精品久久清纯直播| 欧美国产欧美亚州国产日韩mv天天看完整| 久久免费高清| 99国内精品| 国产精品免费在线 | 亚洲亚洲精品在线观看| 先锋亚洲精品| 亚洲国产精品悠悠久久琪琪| 欧美激情视频免费观看| 亚洲一区欧美一区| 久久久亚洲欧洲日产国码αv| 精品va天堂亚洲国产| 免费短视频成人日韩| 一区二区久久久久| 亚洲国产日韩综合一区| 欧美视频中文在线看 | 久久人人爽国产| 亚洲黄色大片| 亚洲资源av| 亚洲第一精品在线| 国产精品美女久久久久久免费| 久久精品毛片| 中文精品99久久国产香蕉| 久久综合久久美利坚合众国| 一本色道久久综合亚洲精品小说 | 最新成人在线| 国产午夜精品视频| 欧美日韩一区二区在线观看| 久久精品国产欧美亚洲人人爽| 亚洲片国产一区一级在线观看| 欧美影院精品一区| 亚洲作爱视频| 精品91免费| 国产精品亚洲综合一区在线观看| 免费av成人在线| 欧美一区二区三区免费观看| 亚洲精品免费一二三区| 免费观看日韩av| 久久成人免费| 亚洲一区二区成人| 亚洲人成在线观看一区二区| 国产一区欧美日韩| 国产精品午夜视频| 欧美日韩亚洲综合| 女主播福利一区|