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

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>
            久久久久久久网| 最新国产成人在线观看| 香蕉成人伊视频在线观看| 亚洲精品一区中文| 欧美午夜激情小视频| 中文在线一区| 亚洲在线第一页| 国产一区二区三区高清 | 欧美日一区二区在线观看 | 久久久久免费| 久久久久久精| 日韩午夜在线| 亚洲免费中文字幕| 亚洲电影在线免费观看| 亚洲精品免费在线| 欧美视频官网| 久久最新视频| 欧美日韩亚洲在线| 久久综合久久久久88| 欧美—级高清免费播放| 午夜亚洲福利| 欧美va天堂在线| 午夜精品国产更新| 免费观看不卡av| 香蕉久久一区二区不卡无毒影院| 久久欧美中文字幕| 亚洲一区www| 老司机一区二区三区| 亚洲免费综合| 欧美91大片| 久久久精品动漫| 欧美日韩喷水| 亚洲第一成人在线| 国产亚洲精品aa午夜观看| 亚洲黄色一区二区三区| 国产一区二区三区电影在线观看| 亚洲精品免费电影| 国外成人在线视频| 亚洲男人av电影| 在线亚洲国产精品网站| 久久综合久久88| 久久成人资源| 国产精品日韩| 99国内精品| 日韩一二三区视频| 牛牛精品成人免费视频| 久久蜜桃资源一区二区老牛| 国产精品久久久久7777婷婷| 亚洲人成网站色ww在线| 91久久精品国产91性色tv| 欧美一区观看| 久久九九免费视频| 国产精品视频内| 亚洲深爱激情| 亚洲一区二区精品在线观看| 欧美日韩1区| 亚洲人成网站999久久久综合| 亚洲日本激情| 欧美成人按摩| 亚洲国内精品| 日韩亚洲视频| 欧美日韩在线观看一区二区| 亚洲精品一级| 亚洲性色视频| 国产精品扒开腿做爽爽爽视频| 亚洲精品欧美| 亚洲精品一二| 欧美区日韩区| 一本色道久久综合亚洲精品婷婷| 一区二区三区精密机械公司 | 牛牛影视久久网| 国产综合色产| 久久天天综合| 亚洲高清不卡| 一本色道久久综合狠狠躁篇怎么玩 | 亚洲狠狠丁香婷婷综合久久久| 亚洲人线精品午夜| 欧美激情国产日韩| 亚洲美女在线看| 午夜精品视频| 韩日午夜在线资源一区二区| 久久久欧美精品sm网站| 亚洲国产精品成人精品| 一区二区三区国产精品| 国产嫩草影院久久久久 | 亚洲国产精品嫩草影院| 一区二区三区高清视频在线观看| 国产精品久久久久久久久免费桃花 | 麻豆成人精品| 亚洲裸体俱乐部裸体舞表演av| 欧美视频一区二区三区在线观看| 亚洲女人天堂av| 欧美福利影院| 亚洲欧美国产日韩天堂区| 国产自产女人91一区在线观看| 免费一级欧美在线大片| 一区二区三区欧美| 美女图片一区二区| 亚洲视频免费看| 狠狠色综合色区| 国产精品99一区二区| 久久精品电影| 在线视频精品一区| 免费观看在线综合色| 亚洲中字黄色| 亚洲人成绝费网站色www| 国产精品美女久久久久av超清 | 伊人久久综合| 国产精品国产三级国产aⅴ无密码| 久久精品日产第一区二区三区| 日韩视频免费观看| 免费h精品视频在线播放| 亚洲一区综合| 亚洲精品美女免费| 极品少妇一区二区三区| 国产精品久久一区主播| 欧美成人自拍| 久久久久久久久久看片| 亚洲一区二区三区精品在线| 亚洲人成人一区二区三区| 久久天天躁狠狠躁夜夜爽蜜月| 亚洲无线一线二线三线区别av| 亚洲国产欧美一区二区三区丁香婷| 国产精品日韩精品欧美在线| 欧美日韩播放| 欧美电影在线观看| 久久综合九色九九| 久久久久久亚洲精品杨幂换脸| 亚洲欧美日韩在线高清直播| 一本色道久久综合亚洲二区三区 | 经典三级久久| 国产精品美女久久| 欧美午夜a级限制福利片| 欧美成人免费大片| 牛牛国产精品| 欧美电影资源| 欧美成人一二三| 欧美14一18处毛片| 欧美黄免费看| 欧美精品一线| 欧美日韩在线视频一区| 欧美三级黄美女| 欧美日韩亚洲综合| 国产精品盗摄一区二区三区| 国产精品扒开腿做爽爽爽软件| 欧美视频在线不卡| 国产精品视频不卡| 国产喷白浆一区二区三区| 国产亚洲欧美日韩一区二区| 国产一区二区福利| 一区精品在线播放| 亚洲茄子视频| 一区二区三区高清在线观看| 亚洲一区二区三区在线看| 亚洲视频中文字幕| 销魂美女一区二区三区视频在线| 欧美一区二区精品在线| 久久精品女人| 亚洲福利免费| 中国成人黄色视屏| 欧美在线观看网址综合| 久久精品主播| 欧美精品在线视频| 国产精品扒开腿做爽爽爽软件| 国产欧美日韩三区| 亚洲第一页在线| 一区二区日韩| 久久精品人人做人人综合| 欧美大片一区二区| 亚洲作爱视频| 久久精品免费看| 欧美国产高潮xxxx1819| 国产精品乱码久久久久久| 国产一区高清视频| 日韩亚洲欧美在线观看| 欧美一区二区三区在线观看| 欧美wwwwww| 正在播放欧美视频| 免费黄网站欧美| 国产伦精品一区二区三区高清版| 亚洲电影av在线| 亚洲女女女同性video| 欧美成人免费观看| 亚洲中字在线| 欧美精品一区二区蜜臀亚洲| 国产婷婷色一区二区三区| 日韩视频不卡| 久久综合99re88久久爱| 一本一本a久久| 老司机久久99久久精品播放免费 | 国产一区二区三区自拍| 一区二区欧美在线| 欧美成人一区二区三区| 亚洲欧美激情诱惑| 欧美精品在线播放| 亚洲第一精品电影| 久久久噜噜噜| 亚洲欧美激情一区| 欧美无乱码久久久免费午夜一区| 亚洲激情在线观看|