pyslvs / old Goto Github PK
View Code? Open in Web Editor NEWPyslvs github pages
License: GNU Affero General Public License v3.0
Pyslvs github pages
License: GNU Affero General Public License v3.0
已經可以上傳論文進行比對, 預計開始檢視論文初步版本.
將 Pyslvs-PyQt5 名稱更改為 Pyslvs-UI 以識別為操作介面程式。
Pyslvs-UI 未來可能會改以 PySide2 搭配 QML 來製作 Server 或 Client 端介面。
能夠模擬 https://youtu.be/ZT0kvHf-dtM 機構中的油壓缸嗎?
請逐一檢查, 讓所有範例都能正確執行.
例如:
位於 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()
為發布 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
,由於結構較簡單便不贅述。
官方問題回報:pyinstaller/pyinstaller#3399
可攜的 Python 版本若為 3.7,目前測試 SWIG 與 Cython 的程式庫運作正常。
當前 3.7 無法包裝獨立可執行檔案,應等待 PyInstaller 支援。
透過虛擬編譯測試: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)。
Kotlin 是 Android 平台上的 Swift,即將取代 Java 成為最受歡迎的 Android 程式開發語言。
https://hackernoon.com/rise-of-kotlin-the-programming-language-for-the-next-generation-27beeb529204
由於 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 的需求:
性能:CPython 3.7 為目前維護的版本中速度最快、記憶體用量最少的。正確標示類型註釋有助於提升部分效能。
dataclass
語法糖:透過 dataclass
裝飾器,可以以簡潔的語法設計資料專用的類型,相當於其他程式語言的名稱空間。
當使用者在輸入機構尺寸合成通過點時, 必須與主動轉角的增量對應.
意即:
假如使用者輸入 p1, p2, p3 等三個點, 合成運算必須設法讓機構轉動時, 先通過 p1, 接著通過 p2, 最後則通過 p3,
若使用者希望機構特定點先通過 p1, 再通過 p3, 最後才通過 p2, 則只要改變上述三點的輸入順序即可.
仔細看一下 https://youtu.be/DfznnKUwywQ
https://www.ri.cmu.edu/pub_files/2013/0/CDMC_final.pdf
https://www.eurekalert.org/pub_releases/2013-07/dr-drd071913.php
https://github.com/JarrettR/Stagger
https://medium.com/generative-design/routing-with-graphs-5fb564b02a74
https://github.com/danilnagy/gd_tools
Pyslvs 能夠從中學習到什麼?
目前 Pyslvs 採用 AGPL 的原因是, 若 Pyslvs 與 Open Source 專案結合, 可以免費使用, 但是若與 Close Source 專案結合, 則必須付費, 否則該專案就必須轉為 Open Source, 任何使用者都可以向使用 Pyslvs 的專案要求完整的套件原始碼.
但是當 Pyslvs 越趨成熟後, 除了宣告 AGPL 使用授權外, 還必須思考後續商業使用的收費機制.
相關討論可以參考:
將原先存放 Pelican Markdown 檔案的 content 目錄, 改名為 markdown, 而 content 目錄則用於存放 CMSimfly 靜態網頁, reveal 目錄則放入 Reveal.js 網際投影系統.
協同成員仍透過 users 目錄下的 .leo 進行管理各自的 mardown/.md 檔案, 至於用來轉換成 blog 目錄下的網誌指令, 已經配合取 markdown 目錄中的檔案.
透過根目錄的 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 應該可以是在某一**的連桿上滑動,
之後若再延伸,甚至可以在**中的曲線滑槽中滑動。
另外,針對連桿為油壓缸的模擬條件為,
該直線連桿可在一定範圍內變動長度,
並以不同於固定長度連桿的油壓缸圖示代表。
可以請專題生利用 Pyslvs 投入,並回饋系統修改建議的研究方向:
http://www-labs.iro.umontreal.ca/~bernhard/PDF/Bharaj15WalkingAutomata.pdf
https://songpenghit.github.io/Publication/papers/2017-SIGAsia-Wind-upToy_lowres.pdf
https://bit.ly/2MEaiDa
https://bit.ly/2MiAuGu
http://pub.ist.ac.at/~rzhang/MechRet.pdf
https://youtu.be/XlV-LFozQSc
假如是因為某些特定機構無法以三角形疊代, 希望針對能以三角形疊代的案例, 以能動態展示各點 path 的功能.
雖然是 1977 年的古早資料, 但是很具參考價值, 在探討三種機構問題, kinematic synthesis, balancing of inertia forces and vibration analysis, 在編寫後續研究計畫時的重點之一:
MeKin2D 雖使用 free pascal 編寫, 但是也值得參考. (MeKin2D 原始碼)
至於使用 Matlab 解題的機構相關新書為 Introduction to Mechanism Design: with Computer Applications
By Eric Constans, Karl B. Dyer, 章節與內容也值得參考. (on amazon)
接下來編寫使用手冊時, 希望能夠引用上述資料中的範例.
三階段設計:
其中包含順序流程與反向分析。
為求統一,程式內的表示式想換成 PMKS 表示法(目前只有**模擬採用),以除去開發上可能造成的誤解與不便。
目標:丟入一組 PMKS 表示法,輸入各項參數範圍,產生全新的同類型連桿機構。
使用 PMKS 表示法將可能無法有效看到連桿尺寸(4 接頭以上連桿),這部分值得考慮。
尺寸合成中想改為三角形法 + Sketch Solve 的方式做驗證,以適應各種機構的解題。在尺寸合成演算法中使用數值分析作為驗證是否能成為有效的方案呢?
網頁式桌面應用程式:https://electronjs.org/
跨環境 Unix 應用程式:https://appimage.github.io/apps/
KmolYuan/Pyslvs-UI@9784456 在 Windows 10 64 位元環境, 設定機構模擬後存檔或取檔均會當機.
更新編譯參數:
M_PI
轉為 PI
)。_DEBUG
macro。EXPORT_DLL
。Exposed Declaration:
重新設計端口:
Param
類型攜帶檢索碼用以查詢參數值。Entity
類型攜帶 Param
類型用以查詢該實體的參數值。SolverSystem
類型攜帶 Slvs_System
結構物件。
vector
容器用以堆棧結構物件,解決需要提前計算記憶空間的不便。範例:
預計能夠替換 SWIG 無法維護的版本。
以 p37_adv 環境編譯 master 分支, 目前無法正確存檔.
Windows 64 位元版本: pyslvs-18.9.0.mscv1900-amd64.exe
saveAs() missing 1 required positional argument: 'is_branch'
請參考並在新生週告知各班同學。
http://www.engh.kuas.edu.tw/files/ne/vaba96mkrq.pdf
請逐一檢查是否能模擬所有範例,並分別完成文中的合成結果比較。
其它參考
Python 套件,只需 YAML 設定檔與 doc 目錄,跟原始碼並存。
部署:
https://mkdocs.readthedocs.io/en/stable/user-guide/deploying-your-docs/
可參考 lark-parser/lark 倉儲。
https://hackaday.com/2016/12/17/animatronic-cosplay-wings/
能夠在 Pyslvs 模擬此機構或合成出其他類型的機構嗎?
A declarative, efficient, and flexible JavaScript library for building user interfaces.
🖖 Vue.js is a progressive, incrementally-adoptable JavaScript framework for building UI on the web.
TypeScript is a superset of JavaScript that compiles to clean JavaScript output.
An Open Source Machine Learning Framework for Everyone
The Web framework for perfectionists with deadlines.
A PHP framework for web artisans
Bring data to life with SVG, Canvas and HTML. 📊📈🎉
JavaScript (JS) is a lightweight interpreted programming language with first-class functions.
Some thing interesting about web. New door for the world.
A server is a program made to process requests and deliver data to clients.
Machine learning is a way of modeling and interpreting data that allows a piece of software to respond intelligently.
Some thing interesting about visualization, use data art
Some thing interesting about game, make everyone happy.
We are working to build community through open source technology. NB: members must have two-factor auth.
Open source projects and samples from Microsoft.
Google ❤️ Open Source for everyone.
Alibaba Open Source for everyone
Data-Driven Documents codes.
China tencent open source team.