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

eryar

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

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

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

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

eryar@163.com

1 Introduction

在傳統的機械設計軟件中,一般使用幾何約束求解器來畫草圖,再通過對草圖進行拉伸旋轉等生成特征實現建模功能?;趨祷瘹v史特征方式來建模的軟件繞不開幾何約束求解器,目前主流商用軟件一般使用西門子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>
            国产精品福利网站| 久热爱精品视频线路一| 亚洲欧美视频一区二区三区| 国产精品久久久一本精品| 先锋亚洲精品| 欧美在线亚洲一区| 亚洲国产女人aaa毛片在线| 亚洲高清不卡av| 午夜宅男久久久| 男女激情视频一区| 欧美激情视频一区二区三区不卡| 最新日韩在线视频| 一本色道久久加勒比88综合| 国产精品久久久久久五月尺| 久久久久久久精| 欧美成人一区二区三区片免费| 亚洲香蕉视频| 欧美在线视频免费观看| 亚洲国产成人午夜在线一区| 亚洲肉体裸体xxxx137| 国产精品一区一区三区| 免费成人高清视频| 欧美色图五月天| 久久久久久久波多野高潮日日| 欧美α欧美αv大片| 亚洲欧美日韩第一区| 久久久天天操| 一二三四社区欧美黄| 欧美一进一出视频| 亚洲日本欧美| 亚洲一区二区三区在线看 | 蜜桃av一区二区| 中文精品视频一区二区在线观看| 羞羞视频在线观看欧美| 在线看片成人| 亚洲视频免费在线| 亚洲国产精品久久久久久女王| 亚洲精品一区在线观看香蕉| 国产欧美一区视频| 亚洲区第一页| 国产欧美一区在线| 亚洲精品视频免费观看| 欧美成人午夜激情| 国产精品大片| 乱码第一页成人| 欧美日韩在线一区| 另类专区欧美制服同性| 欧美日韩亚洲一区| 久久久精品国产一区二区三区 | 亚洲少妇一区| 亚洲电影在线播放| 一区二区三区免费网站| 亚洲缚视频在线观看| 中日韩高清电影网| 亚洲高清在线| 久久成人羞羞网站| 亚洲女人小视频在线观看| 久久夜色精品国产亚洲aⅴ| 亚洲欧美综合一区| 欧美日韩mp4| 免费在线亚洲欧美| 国产视频一区免费看| 99国内精品| 精品99一区二区| 亚洲性感激情| 中国女人久久久| 蜜桃久久av一区| 久久久久久夜| 欧美日韩一区二区在线播放| 亚洲国产精品久久久久秋霞不卡 | 亚洲欧美综合一区| 亚洲欧洲三级| 香蕉成人伊视频在线观看| 国产精品99久久久久久宅男 | 伊人精品在线| 亚洲欧美国产视频| 亚洲尤物视频网| 国产精品专区h在线观看| 亚洲国产精品一区二区尤物区 | 欧美激情在线播放| 猫咪成人在线观看| 国产区精品视频| 亚洲一级高清| 亚洲在线视频网站| 欧美日韩一区二区三区在线观看免 | 亚洲欧美视频在线观看视频| 久久久噜噜噜| 欧美影片第一页| 国产精品免费看片| 亚洲最快最全在线视频| 亚洲乱码日产精品bd| 免费久久99精品国产| 老司机精品视频网站| 国产亚洲欧美日韩一区二区| 亚洲视屏在线播放| 日韩亚洲视频| 欧美久久视频| 亚洲巨乳在线| 亚洲视频免费在线观看| 欧美日韩视频在线一区二区 | 性欧美video另类hd性玩具| 欧美午夜电影网| 一区二区日本视频| 一区二区三区四区国产| 欧美日韩不卡视频| 亚洲午夜极品| 亚洲综合第一页| 欧美一区三区三区高中清蜜桃| 国产精品视频网站| 亚洲欧美日韩综合aⅴ视频| 欧美一级黄色网| 国产欧美欧美| 亚洲欧美国产日韩中文字幕| 久久精品国产久精国产一老狼| 国产亚洲一级| 久久免费视频在线| 亚洲国产精品久久久久久女王| 99热免费精品| 欧美视频在线观看免费网址| 在线视频亚洲欧美| 欧美一区1区三区3区公司| 国产精品日韩久久久| 香蕉av777xxx色综合一区| 美女主播精品视频一二三四| 亚洲人体一区| 欧美私人网站| 午夜精品成人在线| 久久精品男女| 在线国产亚洲欧美| 免费不卡中文字幕视频| 亚洲人成7777| 小嫩嫩精品导航| 国产一区二区欧美日韩| 久久免费观看视频| 欧美肥婆在线| 亚洲最新视频在线| 欧美私人网站| 久久国产精品久久久久久久久久| 女仆av观看一区| av72成人在线| 国产日韩欧美日韩大片| 另类av一区二区| 亚洲日本电影| 欧美在线1区| 亚洲国产第一| 欧美性视频网站| 久久国产精品网站| 亚洲国产色一区| 午夜免费电影一区在线观看| 在线免费高清一区二区三区| 欧美喷潮久久久xxxxx| 在线综合视频| 欧美日韩免费一区二区三区视频| 中文精品99久久国产香蕉| 久久se精品一区二区| 亚洲精品国产精品乱码不99| 欧美性大战久久久久| 欧美一区二区三区播放老司机| 免费成人av在线| 亚洲欧美精品中文字幕在线| 国语自产在线不卡| 欧美日韩精品一区二区三区四区 | 久久精品毛片| 日韩视频在线观看国产| 久久免费视频在线观看| 亚洲国产日本| 国产精品久久久久9999| 久久激情视频久久| 99在线精品观看| 久久色在线观看| 亚洲一区不卡| 亚洲国产精品久久久久婷婷老年| 国产精品扒开腿做爽爽爽视频| 久久综合九色九九| 亚洲亚洲精品三区日韩精品在线视频| 美女网站久久| 亚洲亚洲精品在线观看| 国产伊人精品| 欧美日韩在线三区| 久久资源av| 午夜精品视频一区| 亚洲欧洲在线看| 久久频这里精品99香蕉| 亚洲影院免费| 亚洲三级视频| 韩国福利一区| 欧美亚韩一区| 欧美激情视频网站| 久久久精品999| 亚洲免费一区二区| 亚洲人成网站777色婷婷| 麻豆国产精品777777在线| 欧美一区二区精品在线| 一本一本久久a久久精品牛牛影视| 国产午夜精品一区理论片飘花 | 欧美精品一区二区三区在线播放 | 国内外成人免费视频| 欧美日本在线一区| 久久天天狠狠| 久久se精品一区精品二区|