番外のはりの計算式を紹介しています。
マトリクス変位法 台形荷重 です。
マトリクス演算の扱えるプログラム言語があれば便利です。
マトリクス変位法
境界条件による計算式
チェック用プログラム
ruby/tk の cmd.exe のシェルスクリプトです。
000matrix-6.bat で 保存して実行してください。
計算結果は
となります。
:マトリクス変位法 台形荷重
@echo off
ruby -x %0
pause
goto:eof
#!ruby -rtk -rmatrix
def cq5(wf, l, a, c, d, __g__ = 0)
=begin
w = wf * d * (2 * b - d)
w = wf * d * (l - a - c - d)
|d|
A _____wf B ___
_____/_____\_____ _|_d
^ ^
|-a-|---2*b---|-c-|
0 L ---> x
|--------L--------|
=end
b = (l - a - c) / 2.0
w = wf * d * (2 * b - d)
ca =-w / (6 * l ** 2) * ( (b ** 2 + (d - b) ** 2 + 6 * (c + b) ** 2) * (a - b - 2 * c) + 12 * (c + b) ** 3)
cb = w / (6 * l ** 2) * ( (b ** 2 + (d - b) ** 2 + 6 * (a + b) ** 2) * (c - b - 2 * a) + 12 * (a + b) ** 3)
qa = w / l * (c + b)
qb = w / l * (a + b)
if __g__ != 0
cs = w / (6 * l ** 2) * (6 * (a + b) * (c + b) - b ** 2 - (d - b) ** 2) * 6 * __g__ * l
ca = (ca - cs) / (12 * __g__ + 1)
cb = (cb + cs) / (12 * __g__ + 1)
end
return ca, cb, qa, qb
end
def mq5(x, tp, l, a, c, d, wf, ra, ma, ta, va, ei = nil, __g__ = 0)
=begin
|d|
A _____wf B ___
_____/_____\_____ _|_d
^ ^
|-a-|---2*b---|-c-|
0 L ---> x
|--------L--------|
_____
____ /_____\ ____
1____ /|______ ____
________
2____ __| |____
3____ _________ ____
\|
=end
b = (l - a - c) / 2.0
pl = wf * d
w1 = pl * ( (x - a) / d) * (x < a ? 0 : (x < a + d ? 1 : 0))
w2 = pl * (x < a + d ? 0 : (x < a + 2.0 * b ? 1 : 0))
w3 =-pl * ( (x - a - 2.0 * b + d) / d) * (x < a + 2.0 * b - d ? 0 : (x < a + 2.0 * b ? 1 : 0))
p1 = pl * d / 2.0 * (x < a + d ? 0 : 1)
p2 = pl * (2.0 * b - d) * (x < a + 2.0 * b ? 0 : 1)
p3 =-pl * d / 2.0 * (x < a + 2.0 * b ? 0 : 1)
q = ra +
-w1 / 2.0 * (x - a) - w2 * (x - a - d) - w3 / 2.0 * (x - a - 2.0 * b + d) +
-p1 - p2 - p3
m = ma + ra * x +
-w1 / 6.0 * (x - a) ** 2 - w2 / 2.0 * (x - a - d) ** 2 - w3 / 6.0 * (x - a - 2.0 * b + d) ** 2 +
-p1 * (x - a - 2.0 / 3.0 * d) - p2 * (x - a - d - 1.0 / 2.0 * (2.0 * b - d)) - p3 * (x - a - 2.0 * b + d - 2.0 / 3.0 * d)
t = ta - ma * x - ra / 2.0 * x ** 2 +
w1 / 24.0 * (x - a) ** 3 + w2 / 6.0 * (x - a - d) ** 3 + w3 / 24.0 * (x - a - 2.0 * b + d) ** 3 +
p1 * d ** 2 / 12.0 + p2 * (2.0 * b - d) ** 2 / 6.0 + p3 * d ** 2 / 12.0 +
p1 * d / 3.0 * (x - a - d) + p2 * (2.0 * b - d) / 2.0 * (x - a - 2.0 * b) + p3 * d / 3.0 * (x - a - 2.0 * b) +
p1 / 2.0 * (x - a - d) ** 2 + p2 / 2.0 * (x - a - 2.0 * b) ** 2 + p3 / 2.0 * (x - a - 2.0 * b) ** 2
v = va + ta * x - ma / 2.0 * x ** 2 - ra / 6.0 * x ** 3 +
w1 / 120.0 * (x - a) ** 4 + w2 / 24.0 * (x - a - d) ** 4 + w3 / 120.0 * (x - a - 2.0 * b + d) ** 4 +
p1 * d ** 2 / 12.0 * (x - a - d * 4.0 / 5.0) +
p2 * (2.0 * b - d) ** 2 / 6.0 * (x - a - d - (2.0 * b - d) * 3.0 / 4.0) +
p3 * d ** 2 / 12.0 * (x - a - 2.0 * b + d - d * 4.0 / 5.0) +
p1 * d / 3.0 * (x - a - d) ** 2 / 2.0 +
p2 * (2.0 * b - d) / 2.0 * (x - a - 2.0 * b) ** 2 / 2.0 +
p3 * d / 3.0 * (x - a - 2.0 * b) ** 2 / 2.0 +
p1 / 6.0 * (x - a - d) ** 3 + p2 / 6.0 * (x - a - 2.0 * b) ** 3 + p3 / 6.0 * (x - a - 2.0 * b) ** 3 + __g__ * (m - ma) * l ** 2
if ei == nil
return q, m, t, v
else
return q, m, t / ei, v / ei
end
end
def boundary_condition(tp, l, ca, cb, qa, qb, ei = nil, __g__ = 0, ka = 0, kb = 0, k1 = 1e20, k2 = 1e20, pm1 = 0, pm2 = 0, p1 = 0, p2 = 0)
# A) 剛性マトリクス [k]
b1 = 6.0 / l ** 2
d1 = 2.0 / l
f1 = 4.0 / l
if 0 < __g__ && ei
# せん断変形
p3 = 12.0 * __g__
b1 *= 1 / (1 + p3)
d1 *= 1 / (1 + p3) * (1 - p3 / 2)
f1 *= 1 / (1 + p3) * (1 + p3 / 4)
end
a1 = 2.0 * b1 / l
c1 = b1
h1 = f1
k = Matrix[
[ a1, b1,-a1, c1],
[ b1, f1,-b1, d1],
[-a1,-b1, a1,-c1],
[ c1, d1,-c1, h1] ]
# B) 固定材端力ベクトル {c}
c = Matrix[
[ -da = qa - (ca + cb) / l],
[ ca],
[ -db = qb + (ca + cb) / l],
[ cb] ].map { |u| u.to_f }
# C) 節点外力 {f} = {f} - {c}
f = Matrix[
[ p1],
[ pm1],
[ p2],
[ pm2] ].map { |u| u.to_f } - c
# D) 支点バネ [d]
case tp
when 0; k1 = k2 = 1e20; ka = kb = 0 # 3-1) 単純ばり に 同じ
when 1; k1 = ka = 0; k2 = kb = 1e20 # 3-2) A端自由・B端固定 片持ち に 同じ
when 2; k2 = kb = 0; k1 = ka = 1e20 # 3-3) A端固定・B端自由 片持ち に 同じ
when 3; k1 = k2 = ka = kb = 1e20 # 3-4) 両端固定 に 同じ
when 4; k1 = k2 = kb = 1e20; ka = 0 # 3-5) A端ピン・B端固定 に 同じ
when 5; k1 = k2 = ka = 1e20; kb = 0 # 3-6) A端固定・B端ピン に 同じ
when 6 # 3-7) 両端回転・鉛直バネ支持 に 同じ
else
k1 = k2 = 1e20; ka = kb = 0
end
d = Matrix[
[ k1, 0, 0, 0],
[ 0, ka, 0, 0],
[ 0, 0, k2, 0],
[ 0, 0, 0, kb] ]
# E) 節点の変位ベクトル {y} = ( [k] + [d] )^^-1 * {f}
y = (k + d / ei).inv * f
# F) 材端の内力ベクトル {r} = [k] * {y} + {c}
r = k * y + c
va, ta, vb, tb = y.to_a.flatten
ra, ma, rb, mb = r.to_a.flatten
return -ra, -rb, ma, mb, ta, tb, va, vb
end
l = 5.0 #m
a = 1.0 #m
c = 1.0
n = 1
w = 0 #kN/m
wf = -10.0
d = 1.0
pw = 0 #kN
pm = 0 #kNm
e = 6.5 #kN/m2
b = 0.15 #m
h = 0.30 #m
g = e/15 #kN/m2
fs = 1.2
ei = e * b * h ** 3 / 12 * 10**6
ga = g * b * h * 10**6
__g__ = fs * ei / ga / l ** 2
ka = kb = 500 #kNm/rad
k1 = k2 = 10 #kN/mm
p1 = p2 = 0
pm1, pm2 = -0, -0
tp = 6
ca, cb, qa, qb = cq5(wf, l, a, c, d, __g__)
ra, rb, ma, mb, ta, tb, va, vb = if tp == 6
boundary_condition(tp, l, ca, cb, qa, qb, ei, __g__, ka, kb, k1 * 1000, k2 * 1000, pm1, pm2, p1, p2)
else
boundary_condition(tp, l, ca, cb, qa, qb, ei, __g__)
end
x = 2.5 #m
q, m, t, v = mq5(x, tp, l, a, c, d, wf, ra, ma, ta, va, ei, __g__)
p [x, q, m, t, v]
# Ruby/tk
root = TkRoot.new(title: "Lite & Seen Lite #$0")
canvas = TkCanvas.new(root, width: 1000, height: 800, background: 'white').pack
def __plot_data__(canvas, pt, x, y, sx, sy = 1.0, i)
y1 = 60
plot_data = pt.map { |s| [s[0] * sx + x, s[1] * sy + y] }
yyy =
pt.each { |z| yyy << z[1] }
max_value = yyy.max
$wq.each { |z| z.delete if z } if $wq != && i == 1
$wm.each { |z| z.delete if z } if $wm != && i == 2
$wt.each { |z| z.delete if z } if $wt != && i == 3
$wv.each { |z| z.delete if z } if $wv != && i == 4
m = i
j = 0
ttt =
xxx = plot_data.flatten
0.step(xxx.size - 3, 2).each { |z| ttt << xxx[z..(z + 1)] + xxx[(z + 2)..(z + 3)] }
plot_data = ttt
plot_data.each_with_index { |pt, i|
if m == 1 #SFD
$wq[j * 5] = TkcLine.new(canvas, [pt[0], y], pt[0..1]) if i == 0
$wq[i + 1 + j * 5] = TkcLine.new(canvas, pt)
$wq[i + 2 + j * 5] = TkcLine.new(canvas, pt[2..3], [pt[2], y]) if i == plot_data.size - 1 #|| max_value == (pt[3] - y)
$wq[i + 3 + j * 5] = TkcText.new(canvas, pt[0], y + y1) {
text ( (pt[1] - y) / sy).round(3); anchor 'e'; angle 90 } if i == 0 && pt[0] != pt[2]
if i > 0 && pt[0] == pt[2]
if (pt[1] - pt[3]).abs > 0.005
$wq[i + 4 + j * 5] = TkcText.new(canvas, pt[2], y + y1 - 10) {
text ( (pt[3] - y) / sy).round(3); anchor 'w'; angle 90 }
end
else
$wq[i + 4 + j * 5] = TkcText.new(canvas, pt[2], y + y1) {
text ( (pt[3] - y) / sy).round(3); anchor 'e'; angle 90 }
end
elsif m == 2 #BMD
$wm[j * 5] = TkcLine.new(canvas, [pt[0], y], pt[0..1]) if i == 0
$wm[i + 1 + j * 5] = TkcLine.new(canvas, pt)
$wm[i + 2 + j * 5] = TkcLine.new(canvas, pt[2..3], [pt[2], y]) if i == plot_data.size - 1 || max_value == (pt[3] - y)
$wm[i + 3 + j * 5] = TkcText.new(canvas, pt[0], y + y1) {
text ( (pt[1] - y) / sy).round(3); anchor 'e'; angle 90 } if i == 0 && pt[0] != pt[2]
if i > 0 && pt[0] == pt[2]
if (pt[1] - pt[3]).abs > 0.005
$wm[i + 4 + j * 5] = TkcText.new(canvas, pt[2], y + y1 - 10) {
text ( (pt[3] - y) / sy).round(3); anchor 'w'; angle 90 }
end
else
$wm[i + 4 + j * 5] = TkcText.new(canvas, pt[2], y + y1) {
text ( (pt[3] - y) / sy).round(3); anchor 'e'; angle 90 }
end
elsif m == 3 #SLOPE-DEFLECTION
$wt[j * 5] = TkcLine.new(canvas, [pt[0], y], pt[0..1]) if i == 0
$wt[i + 1 + j * 5] = TkcLine.new(canvas, pt)
$wt[i + 2 + j * 5] = TkcLine.new(canvas, pt[2..3], [pt[2], y]) if i == plot_data.size - 1 || max_value == (pt[3] - y)
$wt[i + 3 + j * 5] = TkcText.new(canvas, pt[0], y + y1) {
text ( (pt[1] - y) / sy).round(3); anchor 'e'; angle 90 } if i == 0
$wt[i + 4 + j * 5] = TkcText.new(canvas, pt[2], y + y1) {
text ( (pt[3] - y) / sy).round(3); anchor 'e'; angle 90 }
elsif m == 4 #DEFLECTION
$wv[j * 5] = TkcLine.new(canvas, [pt[0], y], pt[0..1]) if i == 0
$wv[i + 1 + j * 5] = TkcLine.new(canvas, pt)
$wv[i + 2 + j * 5] = TkcLine.new(canvas, pt[2..3], [pt[2], y]) if i == plot_data.size - 1 || max_value == (pt[3] - y)
$wv[i + 3 + j * 5] = TkcText.new(canvas, pt[0], y + y1) {
text ( (pt[1] - y) / sy).round(3); anchor 'e'; angle 90 } if i == 0
$wv[i + 4 + j * 5] = TkcText.new(canvas, pt[2], y + y1) {
text ( (pt[3] - y) / sy).round(3); anchor 'e'; angle 90 }
end
j += 1
}
end
$wq =
$wm =
$wt =
$wv =
$width = (l <= 5.0 ? 500 : (7.5 < l ? 750 : l * 100))
pt_q =
pt_m =
pt_t =
pt_v =
dn = 10
dx = l / dn
for i in 0..dn
x = dx * i
q, m, t, v = mq5(x, tp, l, a, c, d, wf, ra, ma, ta, va, ei, __g__)
pt_q << [x, q]
pt_m << [x, m]
pt_t << [x, t * 1000]
pt_v << [x, v * 1000]
end
pt1 = pt_t[0][1] / 1000
pt2 = pt_t[-1][1] / 1000
pv1 = pt_v[0][1] / 1000
pv2 = pt_v[-1][1] / 1000
x = 80+10
sx = $width / l
ay = -100+30
TkcLine.new(canvas, x, -ay, x + $width, -ay)
ax = a * sx
bx = (l - a - c) * sx
cx = $width - ax - bx
z = 0
if wf != 0
cx = c * sx
dx = d * sx
# wf
TkcText.new(canvas, x + ax + bx / 2, -ay-10) {
text 'wf = '; anchor 'e'; angle 0 }
TkcText.new(canvas, x + ax + bx / 2, -ay-10) {
text (-wf).round(1).to_s + ' kN/m2'; anchor 'w'; angle 0 }
# |--|
TkcLine.new(canvas, x + ax + dx, -ay-dx/4, x + $width - cx - dx, -ay-dx/4)
TkcLine.new(canvas, x+ax, -ay, x + ax + dx, -ay-dx/4)
TkcLine.new(canvas, x + $width-cx, -ay, x + $width - cx - dx, -ay-dx/4)
# ↓
TkcLine.new(canvas, x + $width / 2, -ay, x + $width / 2, -ay-dx/4)
TkcLine.new(canvas, x + $width / 2-5, -ay-5, x + $width / 2, -ay)
TkcLine.new(canvas, x + $width / 2+5, -ay-5, x + $width / 2, -ay)
end
if w != 0
# w
TkcText.new(canvas, x + ax + bx / 2, -ay-25) {
text 'w = '; anchor 'e'; angle 0 }
TkcText.new(canvas, x + ax + bx / 2, -ay-25) {
text (-w).round(1).to_s + ' kN/m'; anchor 'w'; angle 0 }
if n == 0
# |--|
TkcLine.new(canvas, x + ax, -ay-10, x + ax + bx, -ay-10)
TkcLine.new(canvas, x + ax, -ay, x + ax, -ay-10)
TkcLine.new(canvas, x + ax + bx, -ay, x + ax + bx, -ay-10)
# ↓
TkcLine.new(canvas, x + ax + bx / 2, -ay, x + ax + bx / 2, -ay-10)
TkcLine.new(canvas, x + ax + bx / 2-5, -ay-5, x + ax + bx / 2, -ay)
TkcLine.new(canvas, x + ax + bx / 2+5, -ay-5, x + ax + bx / 2, -ay)
else
if z == 0
# |/|
x1, y1 = ax, (n < 0 ? -10*(n.abs+1) : 0)
for i in 1..3 * n.abs
if n < 0
x2, y2 = ax + (s = i / (3 * n.to_f.abs)) * bx, -10*(n.abs+1) -(-10*(n.abs+1)) * s ** n.abs
else
x2, y2 = ax + (s = i / (3 * n.to_f.abs)) * bx, (-10*(n.abs+1)) * s ** n.abs
end
TkcLine.new(canvas, x + x1, -ay + y1, x + x2, -ay + y2)
x1, y1 = x2, y2
end
else
# |\|
x1, y1 = $width-cx, (n < 0 ? -10*(n.abs+1) : 0)
for i in 1..3 * n.abs
if n < 0
x2, y2 = cx + (s = i / (3 * n.to_f.abs)) * bx, -10*(n.abs+1) -(-10*(n.abs+1)) * s ** n.abs
else
x2, y2 = cx + (s = i / (3 * n.to_f.abs)) * bx, (-10*(n.abs+1)) * s ** n.abs
end
x2 = $width - x2
TkcLine.new(canvas, x + x1, -ay + y1, x + x2, -ay + y2)
x1, y1 = x2, y2
end
end
# ↓
if n < 0
if z == 0
TkcLine.new(canvas, x + ax, -ay, x + ax, -ay-10*(n.abs+1))
TkcLine.new(canvas, x + ax-5, -ay-5, x + ax, -ay)
TkcLine.new(canvas, x + ax+5, -ay-5, x + ax, -ay)
else
TkcLine.new(canvas, x + ax + bx, -ay, x + ax + bx, -ay-10*(n.abs+1))
TkcLine.new(canvas, x + ax + bx-5, -ay-5, x + ax + bx, -ay)
TkcLine.new(canvas, x + ax + bx+5, -ay-5, x + ax + bx, -ay)
end
else
if z == 0
TkcLine.new(canvas, x + ax + bx, -ay, x + ax + bx, -ay-10*(n+1))
TkcLine.new(canvas, x + ax + bx-5, -ay-5, x + ax + bx, -ay)
TkcLine.new(canvas, x + ax + bx+5, -ay-5, x + ax + bx, -ay)
else
TkcLine.new(canvas, x + ax, -ay, x + ax, -ay-10*(n+1))
TkcLine.new(canvas, x + ax-5, -ay-5, x + ax, -ay)
TkcLine.new(canvas, x + ax+5, -ay-5, x + ax, -ay)
end
end
end
end
if pw != 0
ax = a / l
# ↓
TkcLine.new(canvas, x + $width * ax, -ay, x + $width * ax, -ay-30)
TkcLine.new(canvas, x + $width * ax-5, -ay-5, x + $width * ax, -ay)
TkcLine.new(canvas, x + $width * ax+5, -ay-5, x + $width * ax, -ay)
# P
TkcText.new(canvas, x + $width *ax, -ay-40) {
text 'P = '; anchor 'e'; angle 0 }
TkcText.new(canvas, x + $width *ax, -ay-40) {
text (-pw).round(1).to_s + ' kN'; anchor 'w'; angle 0 }
end
if pm != 0
ax = a / l
TkcLine.new(canvas, x + $width * ax, -ay, x + $width * ax+20, -ay-20)
TkcLine.new(canvas, x + $width * ax+20, -ay-20, x + $width * ax+20-7, -ay-20)
TkcLine.new(canvas, x + $width * ax+20, -ay-20, x + $width * ax+20, -ay-13)
TkcLine.new(canvas, x + $width * ax+20+3, -ay-23, x + $width * ax+20-4, -ay-23)
TkcLine.new(canvas, x + $width * ax+20+3, -ay-23, x + $width * ax+20+3, -ay-16)
# PM
TkcText.new(canvas, x + $width * ax+20+25, -ay-29) {
text 'PM ='; anchor 'e'; angle 0 }
TkcText.new(canvas, x + $width * ax+20+25, -ay-29) {
text (pm).round(1).to_s + ' kNm'; anchor 'w'; angle 0 }
end
# ^ ^
if tp == 0
TkcLine.new(canvas, x-5, -ay+5, x, -ay)
TkcLine.new(canvas, x+5, -ay+5, x, -ay)
TkcLine.new(canvas, x + $width-5, -ay+5, x + $width, -ay)
TkcLine.new(canvas, x + $width+5, -ay+5, x + $width, -ay)
elsif tp == 1
TkcLine.new(canvas, x + $width-1, -ay+5, x + $width-1, -ay-5)
TkcLine.new(canvas, x + $width+1, -ay+5, x + $width+1, -ay-5)
elsif tp == 2
TkcLine.new(canvas, x-1, -ay+5, x-1, -ay-5)
TkcLine.new(canvas, x+1, -ay+5, x+1, -ay-5)
elsif tp == 3
TkcLine.new(canvas, x-1, -ay+5, x-1, -ay-5)
TkcLine.new(canvas, x+1, -ay+5, x+1, -ay-5)
TkcLine.new(canvas, x + $width-1, -ay+5, x + $width-1, -ay-5)
TkcLine.new(canvas, x + $width+1, -ay+5, x + $width+1, -ay-5)
elsif tp == 4
TkcLine.new(canvas, x-5, -ay+5, x, -ay)
TkcLine.new(canvas, x+5, -ay+5, x, -ay)
TkcLine.new(canvas, x + $width-1, -ay+5, x + $width-1, -ay-5)
TkcLine.new(canvas, x + $width+1, -ay+5, x + $width+1, -ay-5)
elsif tp == 5
TkcLine.new(canvas, x-1, -ay+5, x-1, -ay-5)
TkcLine.new(canvas, x+1, -ay+5, x+1, -ay-5)
TkcLine.new(canvas, x + $width-5, -ay+5, x + $width, -ay)
TkcLine.new(canvas, x + $width+5, -ay+5, x + $width, -ay)
elsif tp == 6
if k1 != 0 || ka != 0
ax = 0
# ^ ^
TkcLine.new(canvas, x + $width*ax, -ay, x + $width*ax, -ay+5, x + $width*ax-5, -ay+10, x + $width*ax+5, -ay+15, x + $width*ax, -ay+20, x + $width*ax, -ay+25)
TkcLine.new(canvas, x + $width*ax-5, -ay+25, x + $width*ax+5, -ay+25)
if ka != 0
# TkcLine.new(canvas, do_ci([x + $width*ax, -ay+20, x + $width*ax, -ay+23]).hp(32))
end
end
if k2 != 0 || kb != 0
ax = 1
# ^ ^
TkcLine.new(canvas, x + $width*ax, -ay, x + $width*ax, -ay+5, x + $width*ax-5, -ay+10, x + $width*ax+5, -ay+15, x + $width*ax, -ay+20, x + $width*ax, -ay+25)
TkcLine.new(canvas, x + $width*ax-5, -ay+25, x + $width*ax+5, -ay+25)
if kb != 0
# TkcLine.new(canvas, do_ci([x + $width*ax, -ay+20, x + $width*ax, -ay+23]).hp(32))
end
end
if k1 != 0
ax = 0
r1 = pv1.to_f * k1 * 1000
k1 = 99999999 if 99999999 < k1
# K1
TkcText.new(canvas, x + $width *ax+50, -ay+15) {
text 'K1 = '; anchor 'e'; angle 0 }
TkcText.new(canvas, x + $width *ax+50, -ay+15) {
text (k1).round(0).to_s + ' kN/mm'; anchor 'w'; angle 0 }
# R1
TkcText.new(canvas, x + $width *ax+50, -ay+45) {
text 'R1 = '; anchor 'e'; angle 0 }
TkcText.new(canvas, x + $width *ax+50, -ay+45) {
text (p1-r1).round(1).to_s + ' kN'; anchor 'w'; angle 0 }
end
if k2 != 0
ax = 1
r2 = pv2.to_f * k2 * 1000
k2 = 99999999 if 99999999 < k2
# K2
TkcText.new(canvas, x + $width *ax+50, -ay+15) {
text 'K2 = '; anchor 'e'; angle 0 }
TkcText.new(canvas, x + $width *ax+50, -ay+15) {
text (k2).round(0).to_s + ' kN/mm'; anchor 'w'; angle 0 }
# R2
TkcText.new(canvas, x + $width *ax+50, -ay+45) {
text 'R2 = '; anchor 'e'; angle 0 }
TkcText.new(canvas, x + $width *ax+50, -ay+45) {
text (p2-r2).round(1).to_s + ' kN'; anchor 'w'; angle 0 }
end
if ka != 0
ax = 0
# KM1
TkcText.new(canvas, x + $width *ax+50, -ay+30) {
text 'KM1 = '; anchor 'e'; angle 0 }
TkcText.new(canvas, x + $width *ax+50, -ay+30) {
text (ka).round(0).to_s + ' kNm/rad'; anchor 'w'; angle 0 }
# RM1
rm1 = pt1.to_f * ka #/ 1000.0
TkcText.new(canvas, x + $width *ax+50, -ay+60) {
text 'RM1 = '; anchor 'e'; angle 0 }
TkcText.new(canvas, x + $width *ax+50, -ay+60) {
text (pm1-rm1).round(1).to_s + ' kNm'; anchor 'w'; angle 0 }
end
if kb != 0
ax = 1
# KM2
TkcText.new(canvas, x + $width *ax+50, -ay+30) {
text 'KM2 = '; anchor 'e'; angle 0 }
TkcText.new(canvas, x + $width *ax+50, -ay+30) {
text (kb).round(0).to_s + ' kNm/rad'; anchor 'w'; angle 0 }
# RM1
rm2 = pt2.to_f * kb #/ 1000
TkcText.new(canvas, x + $width *ax+50, -ay+60) {
text 'RM2 = '; anchor 'e'; angle 0 }
TkcText.new(canvas, x + $width *ax+50, -ay+60) {
text (pm2-rm2).round(1).to_s + ' kNm'; anchor 'w'; angle 0 }
end
end
if p1 != 0
ax = 0
TkcLine.new(canvas, x + $width * ax, -ay, x + $width * ax, -ay-30)
TkcLine.new(canvas, x + $width * ax-5, -ay-5, x + $width * ax, -ay)
TkcLine.new(canvas, x + $width * ax+5, -ay-5, x + $width * ax, -ay)
# P1
TkcText.new(canvas, x + $width *ax, -ay-55) {
text 'P1 = '; anchor 'e'; angle 0 }
TkcText.new(canvas, x + $width *ax, -ay-55) {
text (-p1).round(1).to_s + ' kN'; anchor 'w'; angle 0 }
end
if p2 != 0
ax = 1
TkcLine.new(canvas, x + $width * ax, -ay, x + $width * ax, -ay-30)
TkcLine.new(canvas, x + $width * ax-5, -ay-5, x + $width * ax, -ay)
TkcLine.new(canvas, x + $width * ax+5, -ay-5, x + $width * ax, -ay)
# P2
TkcText.new(canvas, x + $width *ax, -ay-55) {
text 'P2 = '; anchor 'e'; angle 0 }
TkcText.new(canvas, x + $width *ax, -ay-55) {
text (-p2).round(1).to_s + ' kN'; anchor 'w'; angle 0 }
end
if pm1 != 0
ax = 0
# ↓
TkcLine.new(canvas, x + $width * ax, -ay, x + $width * ax+20, -ay-20)
TkcLine.new(canvas, x + $width * ax+20, -ay-20, x + $width * ax+13, -ay-20)
TkcLine.new(canvas, x + $width * ax+20, -ay-20, x + $width * ax+20, -ay-13)
TkcLine.new(canvas, x + $width * ax+23, -ay-23, x + $width * ax+16, -ay-23)
TkcLine.new(canvas, x + $width * ax+23, -ay-23, x + $width * ax+23, -ay-16)
# M1
TkcText.new(canvas, x + $width*ax+40, -ay-40) {
text 'M1 = '; anchor 'e'; angle 0 }
TkcText.new(canvas, x + $width*ax+40, -ay-40) {
text (-pm1).round(1).to_s + ' kNm'; anchor 'w'; angle 0 }
end
if pm2 != 0
ax = 1
# ↓
TkcLine.new(canvas, x + $width * ax, -ay, x + $width * ax+20, -ay-20)
TkcLine.new(canvas, x + $width * ax+20, -ay-20, x + $width * ax+13, -ay-20)
TkcLine.new(canvas, x + $width * ax+20, -ay-20, x + $width * ax+20, -ay-13)
TkcLine.new(canvas, x + $width * ax+23, -ay-23, x + $width * ax+16, -ay-23)
TkcLine.new(canvas, x + $width * ax+23, -ay-23, x + $width * ax+23, -ay-16)
# M2
TkcText.new(canvas, x + $width*ax+40, -ay-40) {
text 'M2 = '; anchor 'e'; angle 0 }
TkcText.new(canvas, x + $width*ax+40, -ay-40) {
text (-pm2).round(1).to_s + ' kNm'; anchor 'w'; angle 0 }
end
# x1
TkcText.new(canvas, x, -ay+35) {
text (0.0).round(3); anchor 'e'; angle 90 }
# x2
TkcText.new(canvas, x+$width, -ay+35) {
text (l).round(3); anchor 'e'; angle 90 }
# bxD
TkcText.new(canvas, x + $width+50, -ay+90) {
text 'b = '; anchor 'e'; angle 0 }
TkcText.new(canvas, x + $width+50, -ay+90) {
text (b).round(3).to_s + ' m'; anchor 'w'; angle 0 }
TkcText.new(canvas, x + $width+50, -ay+105) {
text 'D = '; anchor 'e'; angle 0 }
TkcText.new(canvas, x + $width+50, -ay+105) {
text (h).round(3).to_s + ' m'; anchor 'w'; angle 0 }
# E
TkcText.new(canvas, x + $width+50, -ay+120) {
text 'E = '; anchor 'e'; angle 0 }
TkcText.new(canvas, x + $width+50, -ay+120) {
text (e).round(4).to_s + ' kN/mm2'; anchor 'w'; angle 0 }
if __g__ != 0
# G
TkcText.new(canvas, x + $width+50, -ay+135) {
text 'G = '; anchor 'e'; angle 0 }
TkcText.new(canvas, x + $width+50, -ay+135) {
text (g).round(4).to_s + ' kN/mm2'; anchor 'w'; angle 0 }
end
y1, y2, y3, y4 = 85+30, 240+30, 385+30, 550+30
TkcText.new(canvas, x, y1-ay, text: 'たわみ mm', anchor: 'sw')
TkcText.new(canvas, x, y2-ay, text: 'たわみ角 rad x 1000', anchor: 'sw')
TkcText.new(canvas, x, y3-ay, text: '曲げ kNm', anchor: 'sw')
TkcText.new(canvas, x, y4-ay, text: 'せん断 kN', anchor: 'sw')
__plot_data__(canvas, pt_q, x, y4-ay, sx, -1.0, 1)
__plot_data__(canvas, pt_m, x, y3-ay, sx, -1.0, 2)
__plot_data__(canvas, pt_t, x, y2-ay, sx, -1.0, 3)
__plot_data__(canvas, pt_v, x, y1-ay, sx, -1.0, 4)
# 座標系
y = 135
TkcLine.new(canvas, x-60, 50+y, x-30, 50+y)
TkcLine.new(canvas, x-30, 50+y, x-35, 45+y)
TkcLine.new(canvas, x-30, 50+y, x-35, 55+y)
TkcText.new(canvas, x-25, 48+y, text: 'x', anchor: 'w')
TkcLine.new(canvas, x-60, 50+y, x-60, 20+y)
TkcLine.new(canvas, x-60, 20+y, x-65, 25+y)
TkcLine.new(canvas, x-60, 20+y, x-55, 25+y)
TkcText.new(canvas, x-60, 18+y, text: 'y', anchor: 's')
TkcLine.new(canvas, x-60, 50+y, x-77, 67+y)
TkcLine.new(canvas, x-77, 67+y, x-70, 67+y)
TkcLine.new(canvas, x-77, 67+y, x-77, 60+y)
TkcLine.new(canvas, x-80, 70+y, x-73, 70+y)
TkcLine.new(canvas, x-80, 70+y, x-80, 63+y)
TkcText.new(canvas, x-67, 67+y, text: 'z', anchor: 'w')
# はり軸線
[y1, y2, y3, y4].each { |y|
TkcLine.new(canvas, x, y-ay, x + $width, y-ay, fill: 'forestgreen')
TkcLine.new(canvas, x, y-ay + 10, x, y-ay - 10, fill: 'forestgreen')
TkcLine.new(canvas, x + $width / 2, y-ay + 10, x + $width / 2, y-ay - 10, fill: 'forestgreen')
TkcLine.new(canvas, x + $width, y-ay + 10, x + $width, y-ay - 10, fill: 'forestgreen')
}
$bai = 1.0
# マウスホイール
canvas.bind('MouseWheel',
proc { |pm| $bai += 0.1 * (pm == 0 ? 0 : (pm < 0 ? -1 : 1))
__plot_data__(canvas, pt_m, x, y3-ay, sx, -$bai, 2)
__plot_data__(canvas, pt_q, x, y4-ay, sx, -$bai, 1)
__plot_data__(canvas, pt_v, x, y1-ay, sx, -$bai, 4)
__plot_data__(canvas, pt_t, x, y2-ay, sx, -$bai, 3)
}, "%D")
Tk.mainloop
__END__