Giter Site home page Giter Site logo

old's People

Contributors

kmolyuan avatar mdecourse avatar s40723145 avatar kmolab avatar s40723102 avatar pyslvs avatar s40723103 avatar s40723245 avatar 40723153 avatar scrum-3 avatar scrum-1 avatar

Stargazers

 avatar  avatar

Watchers

 avatar  avatar  avatar

Forkers

gitter-badger

old's Issues

關於介面

將 Pyslvs-PyQt5 名稱更改為 Pyslvs-UI 以識別為操作介面程式。

Pyslvs-UI 未來可能會改以 PySide2 搭配 QML 來製作 Server 或 Client 端介面。

部分 python_solvespace 範例未使用移動參考座標

請逐一檢查, 讓所有範例都能正確執行.

例如:

位於 core/libs/python_solvespace/example 目錄下,

正確的 example_crank_rocker_draw.py, 應該如下:

'''
example_crank_rocker_draw.py
python3 -m pip install matplotlib
Point1 (0, 0)
Point2(90, 0)
link1 length 35
link2 length 70
link3 length 70
triangle length 70, 40, 40
'''
from slvs import *
from math import *
import matplotlib.pyplot as plt

# variables
d0 = 90
n1 = 35
n2 = 70
t1 = 40
t2 = 40
t3 = 70

# use moving reference frame as p2 prime, increment angel is 5 degree
def crank_rocker(degree, p2x, p2y, p3x, p3y, p4x, p4y, p5x, p5y):
    sys = System()
    g = 1
    # origin Point zero
    p0 = sys.add_param(0.0)
    p1 = sys.add_param(0.0)
    p2 = sys.add_param(0.0)
    Point0 = Point3d(p0, p1, p2)

    # add normal vector
    qw, qx, qy, qz = Slvs_MakeQuaternion(1, 0, 0, 0, 1, 0)
    p3 = sys.add_param(qw)
    p4 = sys.add_param(qx)
    p5 = sys.add_param(qy)
    p6 = sys.add_param(qz)
    Normal1 = Normal3d(p3, p4, p5, p6)

    # add workplane
    Workplane1 = Workplane(Point0, Normal1)

    # convert 3D point to 2D point
    p7 = sys.add_param(0.0)
    p8 = sys.add_param(0.0)
    Point1 = Point2d(Workplane1, p7, p8)
    Constraint.dragged(Workplane1, Point1)

    #add Point2 and Line0
    p9 = sys.add_param(d0)
    p10 = sys.add_param(0.0)
    Point2 = Point2d(Workplane1, p9, p10)
    Constraint.dragged(Workplane1, Point2)
    
    p11 = sys.add_param(p2x)
    p12 = sys.add_param(p2y)
    moving2 = Point2d(Workplane1, p11, p12)
    Constraint.dragged(Workplane1, moving2)
    # Line0 depends on Point1 and moving2
    Line0 = LineSegment2d(Workplane1, Point1, moving2)

    # triangle Point4- Point3-Point5
    p13 = sys.add_param(p3x)
    p14 = sys.add_param(p3y)
    Point3 = Point2d(Workplane1, p13, p14)
    p15 = sys.add_param(p4x)
    p16 = sys.add_param(p4y)
    Point4 = Point2d(Workplane1, p15, p16)
    p17 = sys.add_param(p5x)
    p18 = sys.add_param(p5y)
    Point5 = Point2d(Workplane1, p17, p18)
    Constraint.distance(t1, Workplane1, Point4, Point3)
    Constraint.distance(t2, Workplane1, Point3, Point5)
    Constraint.distance(t3, Workplane1, Point4, Point5)

    # add Line1 and link length constraints
    Constraint.distance(n1, Workplane1, Point1, Point4)
    Constraint.distance(n2, Workplane1, Point2, Point5)
    Line1 = LineSegment2d(Workplane1, Point1, Point4)

    #add rotation angle constraint
    Constraint.angle(Workplane1, degree, Line1, Line0, False)

    #solve for results
    sys.calculateFaileds = 1;

    sys.solve()
    result = sys.result

    if(result == SLVS_RESULT_OKAY):

        # return coordinates of Point3
        return sys.get_param(13).val, sys.get_param(14).val, sys.get_param(15).val, sys.get_param(16).val, sys.get_param(17).val, sys.get_param(18).val

    elif (result == SLVS_RESULT_INCONSISTENT):
        print ("solve failed", degree)
        print ("SLVS_RESULT_INCONSISTENT")
        print ("%d DOF" % sys.dof)
    elif (result == SLVS_RESULT_DIDNT_CONVERGE):
        print ("solve failed")
        print ("SLVS_RESULT_DIDNT_CONVERGE")
        print ("%d DOF" % sys.dof)
    elif (result == SLVS_RESULT_TOO_MANY_UNKNOWNS):
        print ("solve failed")
        print ("SLVS_RESULT_TOO_MANY_UNKNOWNS")
        print ("%d DOF" % sys.dof)

# main program
Xval  = []
Yval  = []
inc = 5
# initially Point3, Point4, Point5 coordinate
p3x = 20
p3y = 20
p4x = 0
p4y = 10
p5x = 30
p5y = 20
for i in range(0, 360+inc*3, inc):
    # moving reference point
    p2x = d0*cos(i*pi/180)
    p2y = d0*sin(i*pi/180)
    try:
        p3x, p3y, p4x, p4y, p5x, p5y = crank_rocker(inc, p2x, p2y, p3x, p3y, p4x, p4y, p5x, p5y)
        Xval += [p3x]
        Yval += [p3y]
        print(i, ":", round(p3x, 4), round(p3y, 4))
    except:
        pass
print ("Solve Completed")

plt.plot(Xval, Yval)
plt.xlabel('x coordinate')
plt.ylabel('y coordinate')
plt.show()

將子模組架構改為標準 PyPI 可散發套件

原因

為發布 API,Pyslvs 與 Python-Solvespace 核心將改為標準 PyPI 可散發模組 (PyPA) 的架構,不限於 Pyslvs-UI 的使用。(本文將會寫於開發手冊)

重點

由於必須同時具有編譯、安裝、打包的功能,依照同為 Cython 撰寫的 enthought/pyql 建立架構。此方法依賴於 setuptools 模組,全部以 setup.py 而非 Makefile 建置,後者將捨棄。

Cython 的目錄能夠與 Python 模組共存,也請將 root(通常同於 entry point 層級)保持一致,否則 Cython 建立 namespace 時會發生錯亂。此架構必須以 setuptools 模組與 Cython 模組建立,目前兩者為獨立,因此必須建立兩次。Cython 根據目錄結構(可使用 __init__.pxd 強制判別模組包,同於 __init__.py)與 cimport 語法判別,和 Python 相仿;而 setuptools 必須手動給予,因為 C / C++ 編譯時可以不看目錄。

由於如此,Adesign 模組無法與其共存,因為 Cython 與 Python 一樣無法跳過目錄的名稱空間。新的目錄結構簡化為下,移除 src 目錄,留下 setup.py 用於測試。

/Adesign
    __init__.pxd
    *.pxd
    *.pyx
    *.pyi
    setup.py
    ...

pyslvs 模組如下:

/pyslvs
    /pyslvs
        /Adesign (submodule)
            __init__.pxd
            *.pxd
            *.pyx
            *.pyi
            setup.py
            ...
        /bfgs_solver
            *.h
            *.cpp
        __init__.pxd
        *.pxd
        *.pyx
        *.pyi
    setup.py
    ...

透過 setup.py 的指令可以編譯、安裝、建立可散發套件。

# 編譯
python setup.py build_ext

# 建立 Egg 套件
python setup.py bdist_egg

# 安裝 Egg 套件
# Egg 套件必須手動於 site-packages 移除
python setup.py install

# 建立 Wheel 套件(必須安裝 wheel 且從 setuptools 導入 setup)
python setup.py bdist_wheel

# 安裝 / 移除 Wheel 套件
pip install pyslvs.xxx.whl
pip uninstall pyslvs

上述 Wheel 套件可以發布在 PyPI 平台上。

Python-Solvespace 的模組包名為 python_solvespace,由於結構較簡單便不贅述。

Python versions

PyInstaller

官方問題回報:pyinstaller/pyinstaller#3399

可攜的 Python 版本若為 3.7,目前測試 SWIG 與 Cython 的程式庫運作正常。

當前 3.7 無法包裝獨立可執行檔案,應等待 PyInstaller 支援。

AppImage

透過虛擬編譯測試:https://travis-ci.org/KmolYuan/Pyslvs-PyQt5

可在 Ubuntu 16.04 線上虛擬機中成功包裝 Python 3.7 的 AppImage。

並且在 Ubuntu 18.04 實體機測試包裝 Python 3.6 的 AppImage 成功。


另外 Pyslvs 18.08 中將提升版本需求為 Python 3.6,以支援 formatted string (PEP 498)。

Pyslvs 將停止支援 Python 3.6

主要原因

由於 Python 3.6 的 typing 模組為首次支援泛型功能,使用諸多方式實作類型檢查。其中最大的問題是無法與某些第三方二進制程式庫的類型相容,如 PyQt 和 PySide。

其中在泛型抽象類別 Generic 的實作上使用特殊元類 GenericMeta。在 Python 中相同元類的類型才能互相繼承,GenericMeta 被開發者回報,會造成某些程式庫不相容而引發類型錯誤。

在 3.7 中 GenericMeta 改為底層類別並不能再引用,Generic 類別在邏輯上改用抽象類別 ABC 的元類 ABCMeta 作為其元類,並導入多種 3.7 的 magic methods,如 __init_subclass__。因此 3.7 可以支援實作 Qt 物件中的泛型標示與檢查。

其他原因

其他 Pyslvs 的需求:

  1. 性能:CPython 3.7 為目前維護的版本中速度最快、記憶體用量最少的。正確標示類型註釋有助於提升部分效能。

  2. dataclass 語法糖:透過 dataclass 裝飾器,可以以簡潔的語法設計資料專用的類型,相當於其他程式語言的名稱空間。

尺寸合成通過點順序與轉動角度

當使用者在輸入機構尺寸合成通過點時, 必須與主動轉角的增量對應.

意即:

假如使用者輸入 p1, p2, p3 等三個點, 合成運算必須設法讓機構轉動時, 先通過 p1, 接著通過 p2, 最後則通過 p3,

若使用者希望機構特定點先通過 p1, 再通過 p3, 最後才通過 p2, 則只要改變上述三點的輸入順序即可.

pyslvs 使用授權考量

目前 Pyslvs 採用 AGPL 的原因是, 若 Pyslvs 與 Open Source 專案結合, 可以免費使用, 但是若與 Close Source 專案結合, 則必須付費, 否則該專案就必須轉為 Open Source, 任何使用者都可以向使用 Pyslvs 的專案要求完整的套件原始碼.

但是當 Pyslvs 越趨成熟後, 除了宣告 AGPL 使用授權外, 還必須思考後續商業使用的收費機制.

相關討論可以參考:

lepture/authlib#59
https://authlib.org/plans

納入 CMSimfly 與 Reveal.js 架構

目錄名稱更改

將原先存放 Pelican Markdown 檔案的 content 目錄, 改名為 markdown, 而 content 目錄則用於存放 CMSimfly 靜態網頁, reveal 目錄則放入 Reveal.js 網際投影系統.

網誌管理

協同成員仍透過 users 目錄下的 .leo 進行管理各自的 mardown/.md 檔案, 至於用來轉換成 blog 目錄下的網誌指令, 已經配合取 markdown 目錄中的檔案.

CMSimfly 程式維護

透過根目錄的 cmsimfly.leo, 使用者可以維護動態內容管理系統的程式碼, 在近端啟動, 可使用 python wsgi.py, 轉為靜態網頁可使用 generate_pages 按鈕.

近端檢視 CMSimfly 所產生位於 content 目錄的檔案, 可在根目錄使用 python -m http.server 或在區域網路中啟動對應的 https 伺服.

對應網站

pyslvs blog: http://www.pyslvs.com/blog/ (可由 http://pyslvs.com 跳轉)

reveal: http://www.pyslvs.com/reveal/

cms: http://www.pyslvs.com/content/

協同分工

cms 由 mdecourse At Gmail 負責編寫, https://github.com/KmolYuan/Pyslvs-PyQt5 程式碼與 pyslvs.com/blog/ 內容則由 pyslvs At Gmail 負責,

編寫 cms 所遭遇的程式執行錯誤或相關討論, 則在本倉儲的 issues 中進行.

滑塊位於某直線上符號式推導

參考資料

https://mde2a1.kmol.info/artifact/7dc04f7ff58ae656

b 為固定點,be 為固定長度連桿,
e 點為滑塊位置,cd 為某條直線,
而約束條件為 e 在 cd 直線上滑動,
目前 Pyslvs 似乎 cd 必須為固定直線,
但 cd 應該可以是在某一**的連桿上滑動,
之後若再延伸,甚至可以在**中的曲線滑槽中滑動。

另外,針對連桿為油壓缸的模擬條件為,
該直線連桿可在一定範圍內變動長度,
並以不同於固定長度連桿的油壓缸圖示代表。

很不錯的參考資料

  1. 雖然是 1977 年的古早資料, 但是很具參考價值, 在探討三種機構問題, kinematic synthesis, balancing of inertia forces and vibration analysis, 在編寫後續研究計畫時的重點之一:

    THE KINEMATICS AND VIBRATION OF PLANAR LINKAGE MECHANISMS

  2. MeKin2D 雖使用 free pascal 編寫, 但是也值得參考. (MeKin2D 原始碼)

  3. 至於使用 Matlab 解題的機構相關新書為 Introduction to Mechanism Design: with Computer Applications
    By Eric Constans, Karl B. Dyer
    , 章節與內容也值得參考. (on amazon)

接下來編寫使用手冊時, 希望能夠引用上述資料中的範例.

Pyslvs 的設計方法

Pyslvs 主要特色

computer_aid_design_method_watermark

三階段設計:

  • Structure Synthesis: 結構合成
  • Dimensional Synthesis: 尺寸合成
  • Kinematic Simulation: **模擬

其中包含順序流程與反向分析。

為求統一,程式內的表示式想換成 PMKS 表示法(目前只有**模擬採用),以除去開發上可能造成的誤解與不便。

尺寸合成改進

目標:丟入一組 PMKS 表示法,輸入各項參數範圍,產生全新的同類型連桿機構。

  1. 使用 PMKS 表示法將可能無法有效看到連桿尺寸(4 接頭以上連桿),這部分值得考慮。

    • 解 1:由使用者調整連桿尺寸的配置方案。(開發時間稍長)
    • 解 2:全部使用座標作為亂數生成對象,另外加入約束。(有不穩定的結果、運算效率差)
  2. 尺寸合成中想改為三角形法 + Sketch Solve 的方式做驗證,以適應各種機構的解題。在尺寸合成演算法中使用數值分析作為驗證是否能成為有效的方案呢?

桌面應用程式發展

近代桌面應用程式發展探討

Electron.js

網頁式桌面應用程式:https://electronjs.org/

  • 主打 Javascript、HTML、CSS,透過 Node.js 進行近端執行。
  • 可移植網頁版的應用程式作為客戶端。
  • 跨平台,並且有線上 CI 服務。

AppImage

跨環境 Unix 應用程式:https://appimage.github.io/apps/

  • 傳統環境開發,支援任何相依套件。
  • 須搭配其他 CI 服務做環境支援(相容性矩陣)。

Python-Solvespace Cython wrapper

更新編譯參數:

Exposed Declaration:

重新設計端口:

  • https://github.com/KmolYuan/python-solvespace/blob/master/Cython/slvs.pyx
  • 透過 Param 類型攜帶檢索碼用以查詢參數值。
  • 透過 Entity 類型攜帶 Param 類型用以查詢該實體的參數值。
  • 透過 SolverSystem 類型攜帶 Slvs_System 結構物件。
    • 使用 C++ 的 vector 容器用以堆棧結構物件,解決需要提前計算記憶空間的不便。
    • 透過本類型的 methods 即可建立所有實體與約束。

範例:

  • 尚未撰寫

預計能夠替換 SWIG 無法維護的版本。

Recommend Projects

  • React photo React

    A declarative, efficient, and flexible JavaScript library for building user interfaces.

  • Vue.js photo Vue.js

    🖖 Vue.js is a progressive, incrementally-adoptable JavaScript framework for building UI on the web.

  • Typescript photo Typescript

    TypeScript is a superset of JavaScript that compiles to clean JavaScript output.

  • TensorFlow photo TensorFlow

    An Open Source Machine Learning Framework for Everyone

  • Django photo Django

    The Web framework for perfectionists with deadlines.

  • D3 photo D3

    Bring data to life with SVG, Canvas and HTML. 📊📈🎉

Recommend Topics

  • javascript

    JavaScript (JS) is a lightweight interpreted programming language with first-class functions.

  • web

    Some thing interesting about web. New door for the world.

  • server

    A server is a program made to process requests and deliver data to clients.

  • Machine learning

    Machine learning is a way of modeling and interpreting data that allows a piece of software to respond intelligently.

  • Game

    Some thing interesting about game, make everyone happy.

Recommend Org

  • Facebook photo Facebook

    We are working to build community through open source technology. NB: members must have two-factor auth.

  • Microsoft photo Microsoft

    Open source projects and samples from Microsoft.

  • Google photo Google

    Google ❤️ Open Source for everyone.

  • D3 photo D3

    Data-Driven Documents codes.