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

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>
            久久久久青草大香线综合精品| 亚洲日本中文字幕免费在线不卡| 亚洲区一区二| 欧美+日本+国产+在线a∨观看| 激情五月***国产精品| 久热精品视频在线免费观看| 久久久久久色| 亚洲精品中文字幕女同| 亚洲精品国产品国语在线app| 欧美日韩中字| 久久国产精品99国产精| 久久久久国内| 99国产精品久久久久久久| aa级大片欧美三级| 国产精品综合| 欧美电影在线播放| 欧美日韩在线观看一区二区三区| 亚洲欧美一区二区视频| 久久久777| 9国产精品视频| 午夜精品成人在线| 亚洲国产高清一区| 亚洲香蕉伊综合在人在线视看| 国产综合自拍| 亚洲人成艺术| 国产专区欧美精品| 亚洲精选久久| 韩日欧美一区二区三区| 亚洲国产欧美国产综合一区 | 久久精品中文| 欧美jizz19性欧美| 欧美一区2区视频在线观看| 久久精品国产清高在天天线| 日韩午夜av电影| 久久不射网站| 亚洲男女毛片无遮挡| 美女脱光内衣内裤视频久久影院 | 亚洲美女黄网| 亚洲欧美激情视频| 亚洲精品视频一区| 欧美一区观看| 午夜精彩国产免费不卡不顿大片| 久久久精品一区| 欧美一区二区免费| 欧美日韩在线观看一区二区三区| 久久性天堂网| 国产日本精品| 亚洲影院免费| 亚洲天堂免费观看| 欧美高清在线播放| 免费在线播放第一区高清av| 国产麻豆精品视频| 亚洲少妇一区| 国产精品99久久久久久久vr| 裸体丰满少妇做受久久99精品| 久久久久久国产精品mv| 国产精品视频xxxx| 中文在线一区| 亚洲免费在线观看视频| 欧美日韩一区二区三区| 亚洲激情婷婷| 亚洲精品一二三| 欧美激情国产日韩| 最新成人av在线| 亚洲精品一区二| 欧美激情一区二区久久久| 亚洲高清资源综合久久精品| 在线欧美一区| 男人的天堂亚洲在线| 欧美福利电影在线观看| 亚洲风情亚aⅴ在线发布| 久久先锋影音av| 欧美国产1区2区| 亚洲精品中文字幕女同| 欧美精品日韩综合在线| 亚洲麻豆av| 亚洲免费视频在线观看| 国产麻豆视频精品| 欧美一区二视频| 欧美黄色成人网| aa级大片欧美| 国产精品无码永久免费888| 亚洲欧美国产高清va在线播| 久久精品欧美| 亚洲国产成人tv| 欧美日韩视频在线观看一区二区三区| 日韩亚洲欧美一区二区三区| 亚洲影音一区| 国内久久婷婷综合| 久久视频在线看| 99riav1国产精品视频| 欧美一区二区三区啪啪| 极品尤物一区二区三区| 欧美国产1区2区| 亚洲在线一区| 欧美韩国在线| 午夜欧美不卡精品aaaaa| 国内精品国语自产拍在线观看| 欧美sm极限捆绑bd| 亚洲在线视频免费观看| 欧美二区在线观看| 午夜久久久久久久久久一区二区| 在线观看精品| 亚洲美女在线看| 国产欧美日韩在线视频| 麻豆av一区二区三区久久| 亚洲免费观看高清完整版在线观看| 亚洲欧美www| 亚洲国产精品久久久| 国产精品福利影院| 老司机精品视频网站| 亚洲一区二区成人| 亚洲国产欧美一区二区三区久久| 午夜精品影院在线观看| 日韩视频不卡| 精品91视频| 国产欧美日韩免费看aⅴ视频| 你懂的国产精品永久在线| 欧美一区=区| 一二三区精品| 亚洲国内精品| 久久一区亚洲| 欧美专区在线播放| 正在播放欧美视频| 亚洲国产另类久久久精品极度| 国产欧美精品日韩精品| 欧美日韩中文在线观看| 欧美成人精品在线播放| 久久久91精品国产| 欧美一级专区| 亚洲欧美一区二区视频| 亚洲视频一区二区免费在线观看| 亚洲国产精品传媒在线观看| 免播放器亚洲一区| 久久天堂国产精品| 久久一区二区三区国产精品| 小处雏高清一区二区三区| 亚洲一区二区三区四区视频| 亚洲美女啪啪| 99视频在线观看一区三区| 亚洲国产91| 亚洲国产精品久久人人爱蜜臀| 国产一区清纯| 伊甸园精品99久久久久久| 国产一区二区在线观看免费| 国产亚洲欧美一区| 国产一区二区三区在线观看精品 | 一区二区三区视频免费在线观看| 亚洲激情国产| 亚洲免费av观看| 99亚洲一区二区| 亚洲综合999| 欧美一级日韩一级| 欧美中文在线免费| 久久久噜噜噜久久狠狠50岁| 久久婷婷亚洲| 欧美电影免费观看网站| 亚洲欧洲综合另类| 99riav国产精品| 性欧美xxxx大乳国产app| 久久久精品欧美丰满| 老**午夜毛片一区二区三区| 欧美成人乱码一区二区三区| 欧美激情精品久久久久久蜜臀| 欧美精品久久一区| 国产精品乱码一区二三区小蝌蚪| 国产欧美成人| 亚洲精品视频在线观看网站| 夜夜嗨av一区二区三区四季av | 亚洲一区在线直播| 性欧美激情精品| 欧美成人精品不卡视频在线观看| 亚洲电影在线| 亚洲女人小视频在线观看| 久久国产精品久久久| 亚洲经典三级| 99国产一区| 久久国产精品久久国产精品| 欧美大秀在线观看| 一区二区三区鲁丝不卡| 欧美在线精品免播放器视频| 欧美18av| 国产日韩欧美精品综合| 亚洲精品乱码久久久久久久久| 亚洲午夜小视频| 免播放器亚洲一区| 亚洲午夜国产一区99re久久| 久久久久国产精品厨房| 欧美天堂亚洲电影院在线观看| 激情欧美一区二区| 亚洲一区二区不卡免费| 欧美成人午夜激情在线| 亚洲影视在线| 欧美理论在线播放| 韩国欧美国产1区| 亚洲男同1069视频| 91久久国产综合久久91精品网站| 午夜精品福利在线| 欧美视频一区在线观看| 91久久国产自产拍夜夜嗨|