-
新增範例Nutcraker
-
倉儲python-solvespace已更新
Nutcraker範例

#行程解題解題:兩個長1.5mm、2.3mm的連桿,在一直線上作動。
#原點的基座塊比工作路徑高0.5mm,寬0.75mm(占用0.38mm)。
#底線距離基座面3.25mm。
#2.3mm的連桿寬0.25mm,半圓頭。
#求最小行程(2.3mm的連桿與基座接觸)。
#求最大行程(半圓頭與底線接觸)。
from slvs import *
from math import *
sys = System(500)
g = 1
#相關參數
h0 = 0.5 #基塊高度(mm)
b0 = 0.75 #基塊寬度(mm)
n1 = 1.5 #後連桿長度(mm)
n2 = 2.3 #前連桿長度(mm)
R0 = 0.25 #半圓頭半徑(mm)
L0 = 3.25 #底線距離(mm)
#開始繪圖
#原點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和行程點Point3
p9 = sys.add_param(2.0)
p10 = sys.add_param(2.0)
Point2 = Point2d(Workplane1, p9, p10)
p11 = sys.add_param(2.0)
p12 = sys.add_param(0.0)
Point3 = Point2d(Workplane1, p11, p12)
Line0 = LineSegment2d(Workplane1, Point1, Point3)
Constraint.horizontal(Workplane1, Line0)
#前連桿碰到基座
Line1 = LineSegment2d(Workplane1, Point2, Point3)
p13 = sys.add_param(b0/2)
p14 = sys.add_param(h0)
Point4 = Point2d(Workplane1, p13, p14)
Constraint.dragged(Workplane1, Point4) #必須鎖住已知點
Constraint.distance(R0, Workplane1, Point4, Line1)
Constraint.distance(n1, Workplane1, Point1, Point2)
Constraint.distance(n2, Workplane1, Point2, Point3)
#以下解題
sys.solve()
Ansmin = sys.get_param(11).val - b0/2
Ansmax = L0 - R0 - b0/2
if (sys.result == SLVS_RESULT_OKAY):
print ("點座標:")
print(("P1(%.3f %.3f %.3f)")%(sys.get_param(7).val, sys.get_param(8).val, sys.get_param(2).val))
print("P1(0.000 0.000 0.000)")
print(("P2(%.3f %.3f %.3f)")%(sys.get_param(9).val, sys.get_param(10).val, sys.get_param(2).val))
print("P2(-0.400 1.450 0.000)")
print(("P3(%.3f %.3f %.3f)")%(sys.get_param(11).val, sys.get_param(12).val, sys.get_param(2).val))
print("P4(1.390 0.000 0.000)\n")
print("Min:")
print(("(%.3f)")%(Ansmin))
print("Max:")
print(("(%.3f)")%(Ansmax))
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)
elif (sys.result == SLVS_RESULT_TOO_MANY_UNKNOWNS):
print ("solve failed")
print ("SLVS_RESULT_TOO_MANY_UNKNOWNS")
print ("%d DOF" % sys.dof)
解題結果:

Nutcracker只有單純的連桿,非常簡單。
而之前的題目有相切約束,Solvespace解這種會有極限的約束都十分不便,常常會出現約束衝突或是正負不分的狀況。
目前還不知道如何解決,只能多注意圓弧曲線的地方,可以用距離約束取代的地方就盡量不用額外輔助線。
倉儲中嵌入副模組
在倉儲中加入了BBBSnowball的模組SolidPython,不過不知道怎麼用。
git submodule add https://github.com/BBBSnowball/SolidPython.git solid-python
應該只是單純放著支援功能。

之前"SLVS資料庫函式"那篇還需要檢查一下,或是做一個英文版副本連結到倉儲Readme。
雖然轉到Python介面中不只那些指令,但是只靠這些指令就能解題目了。
進階應用如切換群組等,稍微看一下原本的範例code或CDemo的原始碼應該就能瞭解。
Comments
comments powered by Disqus