Shade online フォーラム
ログイン
ユーザ名:

パスワード:

IDとパスワードを記憶

パスワード紛失
スレッド表示 | 新しいものから 投稿するには登録が必要です 前のスレッド | 次のスレッド | 下へ
投稿者 スレッド
投稿数: 28
投稿日時: 2011-04-30 23:01
「二重線」と「測定(距離・面積)」のスクリプト、
造園の一人親方してます。
どんなに美しく描いても、
それを実際に作らなければ、収入になりません。
何の意味もありません。

「二重線」と「測定(距離・面積)」のスクリプト、
恵んでもらえませんでしょうか?
それが、欲しければ「他のCADソフト購入しろ」と、
言われれば、その通りですが、予算がありません。

厚かましくも、ずうずうしいお願いですが、
どうか、不憫で哀れなヤツだと思って、
恵んでもらえないでしょうか。
どうか、どうかよろしくお願いします。

現在日本の造園業者の末端は、野垂れ死にも同然の、
とってもミジメで情けない状況にあります。
泣いても、わめいても何も解決しません。
コネと談合だけが支配する、
日本の系列システムを破壊しないことには、
出口はありません。

Shadeは、その為の強力な道具となるでしょう。
どうか、どうかよろしくお願いします。


「二重線」と「測定(距離・面積)」のスクリプト。
http://www.n-kougei.biz/
http://www.n-kougei.net/
投稿数: 189
投稿日時: 2011-05-02 14:20
Re: 「二重線」と「測定(距離・面積)」のスクリプト、
hage さん、こんにちわ、

もし、Mac ユーザーでいらしたら 拙作の 171 ToolBox で長さも面積も求められるのですが、Win ユーザーも使える Python 版ということであれば、

 線形状の長さについては「 でった☆ 」さんが作っていらしたと思います。
 線形状の面積については 下記に簡易版 python script を作っておきました。


すみません、二重線 ← この意味が解りませんでした。



使用上の注意

1)対象が平らな閉じた線形状でなければなりませんが、script の中では平面性のチェックは省略しています。
 平らでない閉じた線形状に対しても計算は行われますが、得られる値には意味がありません。

2)いささかエレガントさにに欠けた求め方をしていますが、できるだけ簡単で、そこそこの精度が得られるように作ってあります。

3)Shade の 4点からなる円形の線形状は真円ではありません。
  真円よりも膨らんでいます。

  半径 100 の 4点からなる円形の線形状の面積は
    31424.72
  となり、
    31415.926 = 100 × 100 × π
  とはなりません。

Bezier 曲線では真円を書き表すことはできません。
ちなみに Illustrator の パスファインダー機能では、この問題を回避するために、円を Bezier 曲線ではなくて primitive としてハンドリングしているみたいです。


- - - - -   ここから下をハサミでチョッキン  - - - - - -
 
	


#  簡単なチェック
	#  線形状が平らであるかのチェックは省略。
	#  平らでない閉じた線形状の場合、エラーにはならないが、得られる結果は意味を持たない
def check_object(ob) :
	if ob.type != 4 :	#  線形状でない
		return False
	elif not ob.closed :	#  閉じていない
		return False
	elif ob.number_of_control_points < 2 :	#  2つ以上のアンカーポイントがない
		return False
	else :
		ob2 = ob.parent
		return not (ob2.type == 2 and ob2.part_type == 1)	#  自由曲面内の線形状は対象外



# bezier の4つの制御点座標を取得
def get_bezier_data(ob) :
	n = ob.total_number_of_control_points
	ap = []
	inh = []
	outh = []
	for i in range(n) :
		cp = ob.control_point(i)
		ap.append(cp.position)
		inh.append(cp.in_handle)
		outh.append(cp.out_handle)
	p = []
	for i in range(n - 1) :
		bz = []
		bz.append(ap[i])
		bz.append(outh[i])
		bz.append(inh[i + 1])
		bz.append(ap[i + 1])
		p.append(bz)
	bz = []
	bz.append(ap[n - 1])
	bz.append(outh[n - 1])
	bz.append(inh[0])
	bz.append(ap[0])
	p.append(bz)
	
	return p


# ベクトル長さ
def get_len_vec(v) :
	return math.sqrt(v[0]**2 + v[1]**2 + v[2]**2)


#  ベクトルの差
def get_sub_vec(p2, p1) :
	return [p2[0] - p1[0], p2[1] - p1[1], p2[2] - p1[2]]
	

#  ベクトルの和
def get_add_vec(p2, p1) :
	return [p2[0] + p1[0], p2[1] + p1[1], p2[2] + p1[2]]
	
	
#  ベクトルの外積
def get_cross_vec(v1, v2) :
	return[v1[1]*v2[2] - v1[2]*v2[1], v1[2]*v2[0] - v1[0]*v2[2], v1[0]*v2[1] - v1[1]*v2[0]]
	

# p1 から p2 への単位ベクトル
def get_unit_vec(p2, p1) :
	v = get_sub_vec(p2, p1)
	r = get_len_vec(v)
	if abs(r) > 0.000001 :
		return [v[0]/r, v[1]/r, v[2]/r]
	else :
		return None
	

#  二つの単位ベクトルの交差角
def get_angle_of_unit_vec(v1, v2) :
	a = v1[0]*v2[0] + v1[1]*v2[1] + v1[2]*v2[2]
	a = max(-1, a)
	a = min(1, a)
	return math.acos(a)

	
#  bezier 区間の全曲率の近似値を簡易的に取得
def get_total_curvature(bz) :
	v1 = get_unit_vec(bz[1], bz[0])
	v2 = get_unit_vec(bz[2], bz[1])
	v3 = get_unit_vec(bz[3], bz[2])	
	b1 = (v1 != None)
	b2 = (v2 != None)
	b3 = (v3 != None)
	
	if b1 and b2 and b3 :
		return get_angle_of_unit_vec(v1, v2) + get_angle_of_unit_vec(v2, v3)
	elif b1 and b2 :
		return get_angle_of_unit_vec(v1, v2)
	elif b2 and b3 :
		return get_angle_of_unit_vec(v2, v3)
	elif b1 and b3 :
		return get_angle_of_unit_vec(v1, v3)
	else :
		return 0
		

# bezier の階差を求める
def get_bezier_difference(bz) :
	d11 = get_sub_vec(bz[1], bz[0])
	d12 = get_sub_vec(bz[2], bz[1])
	d13 = get_sub_vec(bz[3], bz[2])
	d21 = get_sub_vec(d12, d11)
	d22 = get_sub_vec(d13, d12)
	d31 = get_sub_vec(d22, d21)
	return [bz[0], d11, d21, d31]


#  bezier parameter t における座標を返す
def get_point_on_line(b, t) :
	t2 = t*t
	t3 = t*t*t
	x = b[3][0]*t3 + 3*b[2][0]*t2 + 3*b[1][0]*t + b[0][0]
	y = b[3][1]*t3 + 3*b[2][1]*t2 + 3*b[1][1]*t + b[0][1]
	z = b[3][2]*t3 + 3*b[2][2]*t2 + 3*b[1][2]*t + b[0][2]
	return [x, y, z]
	
	
def main() :
	#  簡単なチェック
	ob = scene.active_shape()
	if not check_object(ob) :
		xshade.beep()
		return

	#  線形状の座標を取得
	scene.inhibit_update()
	scene.copy_object(None, None, None, None)
	ob2 = scene.active_shape()
	scene.create_part()
	ob3 = scene.active_shape()
	ob3.cancel_transformation()
	
	ob2.place_child(1)
	p = get_bezier_data(ob2)	# bezier の4つの制御点座標を取得
	c = ob2.center_point		#  線形状の中心座標
	ob3.remove()
	scene.allow_update()
	scene.force_update()
	
	nb = len(p)
	areaV = [0, 0, 0]
	for i in range(nb) :		#  各 bezier 区間について
		bz = p[i]
		theta = get_total_curvature(bz)		#  曲線の曲がり具合を簡易的に求める
		epsilon = 0.05/180*math.pi			# epsilon を小さくすれば精度は上がる
		n = max(1, int(math.ceil(theta/epsilon)))	#  当該 bezier 区間の分割数

		b = get_bezier_difference(bz)			#  bezier の階差表示を求める
		
		v2 = get_sub_vec(bz[0], c)
		v1 = []
		for i in range(n) :
			v1 = v2
			p2 = get_point_on_line(b, float(i + 1)/n)	#  bezier parameter t = float(i + 1)/n) における座標を求める
			v2 = get_sub_vec(p2, c)
			a = get_cross_vec(v1, v2)
			areaV = get_add_vec(areaV, a)
	
	area = get_len_vec(areaV)/2
	k = scene.native_to_user_unit
	area2 = area*k*k
		
	print ''
	print str(area) + ' ( mm^2 )'		
	print str(area2) + ' ( user unit ^2 )'	


	

import math
scene = xshade.scene()
main()

 

投稿数: 28
投稿日時: 2011-05-02 19:06
Re: 「二重線」と「測定(距離・面積)」のスクリプト、
加藤様、さっそく返信頂き真にありがとうございます。
なにせ、私どもスクリプトは全く素人でして、
詳しく分析・検討して再度返信させて頂きます。
とりあえず、まことにありがとう御座います。
遅くなると思いますが、必ず再度返信させていただきます。
ありがとうございます。
投稿数: 28
投稿日時: 2011-05-02 23:15
Re: 「測定(距離・面積)」のスクリプト、
① >線形状の長さについては「 でった☆ 」<
http://www.detta-box.com/script_view.cgi?D_Check_Distance_Between2Points/D_Check_Distance_Between2Points.html
↑これは、「指定した2点間の距離」だったと思います。
線形上を構成する、
3点以上のコントロールポイント(以下CP)には、
適用されないと思います。
例えば、複雑に入り込んだ外周の累計総距離など出ない。
外周工事の見積もり算定の要素としての、「長さ」が出ない。
見積もり計算が出来ない。つまり、仕事で使えない。

線形上を構成する3点以上の「CP」の累計距離がしりたいのです。


② 「面積スクリプト」については感謝・感激です。
匠弥@HOME.PAGEの http://www.iwami.or.jp/hondaf/script/info/index.html
に、多角形の面積を計算スクリプトがあります。
あわせて、よく研究させていただきます。

ご教示、ありがとうございました。




投稿数: 106
投稿日時: 2011-05-02 23:38
Re: 「測定(距離・面積)」のスクリプト、
「その他」の
線形状の長さを表示
D_Bezier_Length.pyc
が累計距離を表示します。
投稿数: 28
投稿日時: 2011-05-02 23:55
Re: 「二重線」。
>二重線 ← この意味<
つまり、「壁」のことです。

ShadeのRoomPrannerにツールがありますが、
全く役立たずで、使えない。
壁の屈曲部がすべて、90度限定されている。
なんで、こんなのがあるのか理解できません。

たしかに、
パス掃引でも出来ますが、
それだと、手作業の目視ですることになります。
寸法・納まりに確信が持てません。
恐ろしくて「お客様」に提出できません。

すいません。
延々と愚痴が続きます。
Shadeは、CADではないので、
当然といえばそれまでですが。

3DのCADは値段が高くて、
末端の職人には手が届きません。

投稿数: 28
投稿日時: 2011-05-03 00:26
Re: 「測定(距離・面積)」のスクリプト、
よく調べもせずに…、すいませんでした。
ありがとうございます。

今、動作確認とHPへ紹介UPしました。
http://www.n-kougei.net/S-try/S-try.htm の下の方)
再度、ありがとうございます。

SHADEで、造園図面作成する意欲が少し沸いてきました。
安価なSHADEで、3D図面が作成できれば、
土建の業界の体質が変ります。
でった様、ありがとうございました。
投稿数: 189
投稿日時: 2011-05-03 00:48
Re: 「二重線」。
引用:

>二重線 ← この意味<
つまり、「壁」のことです。


壁芯から壁を立ち上げるというイメージ かな。

引用:

たしかに、
パス掃引でも出来ますが、
それだと、手作業の目視ですることになります。
寸法・納まりに確信が持てません。


う〜む、「 手作業の目視 」というところがイマイチ思い浮かべられないのですが、
壁の厚みに相当する線形状を壁芯の始端にセットするのが手作業で正確性に欠けるというような意味でしょうか ?
投稿数: 28
投稿日時: 2011-05-03 23:38
Re: 「二重線」。1-a
1-a

投稿数: 28
投稿日時: 2011-05-03 23:40
Re: 「二重線」。1-b
1-b
投稿数: 28
投稿日時: 2011-05-03 23:41
Re: 「二重線」。2
端部が開いている(赤線)

投稿数: 28
投稿日時: 2011-05-03 23:42
Re: 「二重線」。1-b
開いた線形状(折れ線)


投稿数: 28
投稿日時: 2011-05-03 23:47
Re: 「二重線」。③
③ 同上、閉じた二重線。(端部)

投稿数: 28
投稿日時: 2011-05-03 23:49
Re: 「二重線」。④-a 立体
④-a 同上、立体に変換された、「閉じた二重線」

投稿数: 28
投稿日時: 2011-05-03 23:49
Re: 「二重線」。④-b 同上、レンダリング。
④-b 同上、レンダリング。

投稿数: 28
投稿日時: 2011-05-03 23:52
Re: 「二重線」。⑤ 役に立たない「二重線」
⑤  役に立たない「二重線」

投稿数: 28
投稿日時: 2011-05-03 23:53
Re: 「二重線」。⑥
⑥ 役立つ二重線(屈曲部注目)

投稿数: 28
投稿日時: 2011-05-03 23:57
Re: 「二重線」。7
⑦ 二重線で作成された「鋳物扉」

投稿数: 28
投稿日時: 2011-05-03 23:57
Re: 「二重線」。⑧
⑧ 同上、「カーポート」。

投稿数: 28
投稿日時: 2011-05-04 00:03
Re: 「二重線」。二重線のイメージ。
イメージ的には、
ペンツールの先端が二股になってて、
なぞると、線が平行して二重に作成されます。
画像参照↓
(画像①-bの順序が間違いです。スイマセン)

①-a コントロールポイント。

①-b  同上、開いた線形状(折れ線)
    
② 同上、二重線。
     ・端部が開いている(赤線)

③ 同上、閉じた二重線。(端部)

④-a 同上、立体に変換された、「閉じた二重線」
  
④-b 同上、レンダリング。

⑤ 役に立たない「二重線」

⑥ 役立つ二重線(屈曲部注目)

⑦ 二重線で作成された「鋳物扉」

⑧ 同上、「カーポート」。
スレッド表示 | 新しいものから 投稿するには登録が必要です 前のスレッド | 次のスレッド | トップ

最近の投稿

フォーラム スレッド 返信 閲覧 最終投稿
Free Talk DNAの2重らせんの水素結合部位の作成 0 11756 2016-08-01 21:37 Benthos
Free Talk パート内の名前を一括返還 2 14263 2016-03-07 12:21 画像投稿機
Dev Forum イームズシェルチェアーの作成 2 14178 2015-11-25 14:44 CR7
Free Talk MOVファイルについて 17 35278 2014-12-29 17:14 momokuma
Dev Forum 2種類の液体アニメーションを作る方法 0 14257 2014-11-13 10:42 mejapan
Free Talk 面取りについて 0 13372 2014-11-08 15:18 MoonChild
Free Talk 丸太を結ぶ縄の作成について 1 19579 2014-09-18 22:33 kenslab
Free Talk パーティクルフィジックスのメタパーティクルについて 0 13833 2014-09-03 20:40 penta
Free Talk データの保存に関して 2 13662 2014-08-18 01:24 sierra
Free Talk Shade 3D ver14での、ポリゴンメッシュへの変換以上終了 1 14105 2014-04-23 12:04 MASA_