1. CDemo資料庫內容補正

  2. 倉儲python-solvespace已更新

  3. 資料庫解題成功

修復內容

使用修復過的資料庫內容解題,新增將近三分之一的對應函式。

這些函式中也包括需要的相切約束。

由於這些函式都未有對應名稱,所以都是自己編名的,例如equal_angle( )

解題成功

使用的是下列程式碼,在SciTE中解題成功:鏈鏈

鍊條解題:18齒與30齒的鏈條,上下外切線長為200。

小圓圓心為原點,大圓圓心在X軸上,求四個切點的座標

from slvs import from math import sys鏈= System(500) g = 1

相關參數

n0 = 20 #鍊條長度(mm) n1 = 18 #小輪齒數(t) n2 = 30 #大輪齒數(t)

邊長為a的的正n邊形外接圓半徑為:

R=a/(2sin(pi/n)) or R=(a/2)csc(pi/n)

R1 = n0/(2sin(pi/n1)) R2 = n0/(2sin(pi/n2))

開始繪圖

原點Point0

p0 = sys.add_param(0.0) p1 = sys.add_param(0.0) p2 = sys.add_param(0.0) Point0 = Point3d(p0, p1, p2)

XY法線

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)

工作平面

Workplane1 = Workplane(Point0, Normal1)

3D版的Point0=>Point1

p7 = sys.add_param(0.0) p8 = sys.add_param(0.0) Point1 = Point2d(Workplane1, p7, p8) Constraint.dragged(Workplane1, Point1)

Point2

p9 = sys.add_param(0.0) p10 = sys.add_param(200.0) Point2 = Point2d(Workplane1, p9, p10)

上端外切線的兩個點Point3和Point4

p11 = sys.add_param(0.0) p12 = sys.add_param(500.0) Point3 = Point2d(Workplane1, p11, p12) p13 = sys.add_param(500.0) p14 = sys.add_param(500.0) Point4 = Point2d(Workplane1, p13, p14)

下端外切線的兩個點Point5和Point6

p15 = sys.add_param(0.0) p16 = sys.add_param(-500.0) Point5 = Point2d(Workplane1, p15, p16) p17 = sys.add_param(500.0) p18 = sys.add_param(-500.0) Point6 = Point2d(Workplane1, p17, p18)

外切線

Line1 = LineSegment2d(Workplane1, Point3, Point4) Line2 = LineSegment2d(Workplane1, Point5, Point6)

圓弧

Arc1 = ArcOfCircle(Workplane1, Normal1, Point1, Point3, Point5) Constraint.diameter(R12, Workplane1, Arc1) Arc2 = ArcOfCircle(Workplane1, Normal1, Point2, Point6, Point4) Constraint.diameter(R22, Workplane1, Arc2)

X軸Line0

Line0 = LineSegment2d(Workplane1, Point1, Point2) Constraint.horizontal(Workplane1, Line0)

約束

Constraint.tangent(Arc1, Line1, False) Constraint.tangent(Arc2, Line1, False) Constraint.tangent(Arc2, Line2, True) Constraint.distance(200.0, Workplane1, Point3, Point4)

以下解題

sys.solve()

if (sys.result == SLVS_RESULT_OKAY): print ("兩點座標:") print(("(%.3f %.3f %.3f)")%(sys.get_param(7).val, sys.get_param(8).val, sys.get_param(2).val)) print(("(%.3f %.3f %.3f)\n")%(sys.get_param(9).val, sys.get_param(10).val, sys.get_param(2).val)) print ("上切點座標:") print(("(%.3f %.3f %.3f)")%(sys.get_param(11).val, sys.get_param(12).val, sys.get_param(2).val)) print("(-10.770 56.570 0.000)") print(("(%.3f %.3f %.3f)")%(sys.get_param(13).val, sys.get_param(14).val, sys.get_param(2).val)) print("(185.700 93.980 0.000)\n") print ("下切點座標:") print(("(%.3f %.3f %.3f)")%(sys.get_param(15).val, sys.get_param(16).val, sys.get_param(2).val)) print("(-10.770 -56.570 0.000)") print(("(%.3f %.3f %.3f)")%(sys.get_param(17).val, sys.get_param(18).val, sys.get_param(2).val)) print("(185.700 -93.98 0.000)\n") print ("導入函數測試:") print ("R1:") print(R1) print ("R2:") print(R2) print ("pi:") print(pi) print ("%d DOF" % sys.dof) elif (sys.result == SLVS_RESULT_INCONSISTENT): print ("solve failed") print ("SLVS_RESULT_INCONSISTENT") print ("%d DOF" % sys.dof) for i in range(sys.faileds): print(" %lu", sys.failed[i]); elif (sys.result == SLVS_RESULT_DIDNT_CONVERGE): print ("solve failed") print ("SLVS_RESULT_DIDNT_CONVERGE") print ("%d DOF" % sys.dof) for i in range(sys.faileds): print(" %lu", sys.failed[i]); elif (sys.result == SLVS_RESULT_TOO_MANY_UNKNOWNS): print ("solve failed") print ("SLVS_RESULT_TOO_MANY_UNKNOWNS") print ("%d DOF" % sys.dof)

弧與直線相切的函式只能鎖住一頭(布林值調整鎖住頭或尾),所以要下兩次。

不過由於Solvespace對約束的要求十分嚴謹,所以只要下了衝突約束或是重複約束,前者會顯示SLVS_RESULT_INCONSISTENT,後者會顯示SLVS_RESULT_DIDNT_CONVERGE,就得重新檢查寫的程式。

以下是圖解法比對(其實已經記錄在上面的程式中供比對),兩者使用的資料庫函式應該是一樣的。

結果是零誤差。

以下是SciTE的顯示結果,較上方的是Python運算的結果。


使用這個函式庫非常簡單,跟在Solvespace上畫圖一樣。

先設定起始值後,利用約束調整這些值(而且可以將固定值鎖住),確定之後就能算出答案。

第一次使用自己寫的介面,由於以熟悉它們的從屬關係和解題公式,所以用起來十分上手。

這個函式庫最大的缺點應該是取值不太方便吧,雖然仍可以使用自己命名或是直接內嵌進函式中,可是取值時是按照註冊順序取的,所以養成輸入值時給編號比較不容易亂掉。


Comments

comments powered by Disqus