Pyslvs 開發進度:
- 呆鍊偵測合併功能
- 設立儲存用資料格式
- GUI 讀取偵錯輸出
Pyslvs 開發進度
呆鍊偵測合併功能
當建立呆鍊時,預設會啟用移除重複連桿的選項。
此選項會在建立呆鍊前自動移除衝突的連桿,並且能良好配合 Undo Redo 功能。
如果效果不錯,可以延用到建立連桿,自動將衝突項目解決。
設立儲存用資料格式
新的資料存取方式是為了取代 Python 的 dict,用自訂的 class 處理座標和約束儲存的工作。
使用 decorator 的 @property
防止錯誤的資料寫入。
class VPoint: def __init__(self, x=0., y=0., fix=False): self.set(x, y, fix) self._cx = self._x self._cy = self._y @property def x(self): return self._x @property def y(self): return self._y @x.setter def x(self, x): self._x = x @y.setter def y(self, y): self._y = y @property def fix(self): return self._fix @property def cx(self): return self._cx @property def cy(self): return self._cy def set(self, x=0., y=0., fix=False): self._x = x self._y = y self._fix = fix def move(self, x=0., y=0.): self._cx = x self._cy = y def reset(self): self._x = self._cx self._y = self._cy def __str__(self): return "Point x={v.x} y={v.y} fix={v.fix} cx={v.cx} cy={v.cy}".format(v=self) class VLine: def __init__(self, start=0, end=0, len=0.): self.set(start, end, len) @property def start(self): return self._start @property def end(self): return self._end @property def len(self): return self._len def set(self, start=VPoint(), end=VPoint(), len=0.): self._start = start self._end = end self._len = len def __contains__(self, point): return point==self._start or point==self._end def __str__(self): return "Line start={v.start} end={v.end} len={v.len}".format(v=self) class VChain: def __init__(self, p1=VPoint(), p2=0, p3=0, p1p2=0., p2p3=0., p1p3=0.): self.set(p1, p2, p3, p1p2, p2p3, p1p3) @property def p1(self): return self._p1 @property def p2(self): return self._p2 @property def p3(self): return self._p3 @property def p1p2(self): return self._p1p2 @property def p2p3(self): return self._p2p3 @property def p1p3(self): return self._p1p3 def set(self, p1=0, p2=0, p3=0, p1p2=0., p2p3=0., p1p3=0.): self._p1 = p1 self._p2 = p2 self._p3 = p3 self._p1p2 = p1p2 self._p2p3 = p2p3 self._p1p3 = p1p3 def __contains__(self, point): return point==self._p1 or point==self._p2 or point==self._p3 def __str__(self): return "Chain p1={v.p1} p2={v.p2} p3={v.p3} p1p2={v.p1p2} p2p3={v.p2p3} p1p3={v.p1p3}".format(v=self) class VShaft: def __init__(self, cen=0, ref=0, start=0., end=360., demo=0., isParallelogram=False): self.set(cen, ref, start, end, demo, isParallelogram) @property def cen(self): return self._cen @property def ref(self): return self._ref @property def start(self): return self._start @property def end(self): return self._end @property def demo(self): return self._demo @demo.setter def demo(self, demo): self._demo = demo @property def isParallelogram(self): return self._isParallelogram def set(self, cen=0, ref=0, start=0., end=360., demo=0., isParallelogram=False): self._cen = cen self._ref = ref self._start = start self._end = end self._demo = demo self._isParallelogram = isParallelogram def drive(self, demo): if demo>self._start and self._end>demo: self._demo = demo def __contains__(self, point): return point==self._cen or point==self._ref def __str__(self): return "Shaft cen={v.cen} ref={v.ref} start={v.start}, end={v.end} demo={v.demo} isParallelogram={v.isParallelogram}".format(v=self) class VSlider: def __init___(self, cen=0, start=0, end=0): self.set(cen, start, end) @property def cen(self): return self._cen @property def start(self): return self._start @property def end(self): return self._end def set(self, cen=0, start=0, end=0): self._cen = cen self._start = start self._end = end def __contains__(self, point): return point==self._cen or point==self._start or point==self._end def __str__(self): return "Slider cen={v.cen} start={v.start} end={v.end}".format(v=self) class VRod(VSlider): def __init__(self, cen=0, start=0, end=0, pos=0.): self.set(cen, start, end, pos) @property def pos(self): return self._pos def set(self, cen=0, start=0, end=0, pos=0.): super(VRod, self).set(cen, start, end) self._pos = pos def __str__(self): return "Rod cen={v.cen} start={v.start} end={v.end} pos={v.pos}".format(v=self)
GUI 讀取偵錯輸出
在選項中可以偵測並開啟 PyslvsLogFile.log
日誌檔案,並且將寫入方式改為 append,不會清除之前的紀錄。
點選後可以開啟內容,若沒有檔案則會跳出提示。
由尾端開始,最多顯示 1000 個字元。
-
PMKS
最近在讀 PMKS 符號式的部份,不過對照 C# 原始碼只能稍微理解大概,之後也需要釐清其中數學式的運算方法。
其中的程式有整個模組可以計算牛頓力學的部份(包含輸出圖表),不過礙於不太能理解 C#,只能用 Visual Studio 慢慢找到需要的功能,不像 C++ 能快速理解其功能或註釋。
這部份期望的是可以得到即時運算出路徑的能力、以 GUI 套用 PMKS 改善部份網頁執行的不便。
-
Solvespace kernel
今天重新看了一下舊的 Solvespace 原始碼,基礎系統 System 類型中並沒有移除實體或約束的功能,每次更改都需要重新計算,是滿可惜的地方,而且處理方面不像 PMKS 有效率,可能之後會將後者作為處理 calculation 的 kernel。
-
演算法
連接的原始碼倉儲已更新四連桿的 py 檔,如果可以六連桿的部份應該能放在一起。
不過當前的 Cython kernel 沒有回傳運算進度的功能(如大廠分析軟體的方式顯示發散和收斂進度),雖然可能會造成執行效率降低。
-
程式
會找個時間教一下學弟計算機概論和物件導向程式的部份(C++ 和 Python),盡量讓需要程式處理的組員能夠連接 Python API 和讓 2、3 人以上有看懂 C++ 的能力。
Comments
comments powered by Disqus