2つの形状(バウンディングボックス)の中心位置を起点に距離・長さを図りたい(スクリプト)

モデリングを行う際に、単純な長さや距離は定規やメジャーツールで確認することができます。
しかし、形状の中心やShade3Dのバウンディングボックスの中心どうしの距離を確認したい場合があります。
例えば、プロダクトデザインや景観図の建物・構造物、特定のファイル形式で入出力する際に形状間の
距離が重要な場合などです。

・図面上の距離を測る (定規)
https://knowledge.shade3d.jp/kb2480
・距離を測る (メジャーツール)
https://knowledge.shade3d.jp/kb985

その場合に、以下のスクリプトを実行することで2つの形状のバウンディングボックスの中心位置の差を距離として測定することができます。
なお、測定することができるのは、2つの形状を複数選択、またはパートに内包して選択している場合です。

・同じパートに内包している場合       ・複数選択で形状を選択している場合
パートを内包する    複数選択で形状を選択する

・測定結果
測定結果

【使用方法】
1・「# @title \ja ■ 選択2形状の中心の差を出力 \endja」から「process()」
までを選択し「コピー」してください。
2・表示メニューよりスクリプトを選択してください。
3・スクリプトウィンドウが表示されますので、フィールド上にマウスカーソルを合わせ「貼り付け」を行なってください。
4・スクリプトウィンドウ内にスクリプトが貼り付けられたのち「実行」ボタンをクリックしてください。
5.操作の実行を促す警告メッセージが表示されます。問題ければOKボタンをクリックしてください。


# @title \ja ■ 選択2形状の中心の差を出力 \endja
# @copyright 2023-2024 Forum8
# @description \ja 補註:2形状選択、あるいは2形状入っているパートの選択で利用可能。\endja
# -*- coding: UTF-8 -*-
import math
def minus_3d(v1):
	return [-v1[0], -v1[1], -v1[2]]
def sum_3d(v1,v2):
	return [v1[0]+v2[0] , v1[1]+v2[1] , v1[2]+v2[2]]
def dif_3d(v1,v2):
	return sum_3d(v1, minus_3d(v2))
def dot_3d(v1,v2):
	return v1[0]*v2[0] + v1[1]*v2[1] + v1[2]*v2[2]
def len_3d(v):
	return math.sqrt(dot_3d(v,v))
 
need_check = False
def process():
 scene = xshade.scene()
 shapes = []
 if len(scene.active_shapes) == 1:
  shape = scene.active_shape()
  if not shape.type == 2:
   print("形状は2つのみ選んでください。")
   return
  if not shape.number_of_sons == 2:
   print("形状は2つのみ選んでください。")
   return
  shapes.append(shape.son.bro)
  shapes.append(shape.son.bro.bro)
 elif len(scene.active_shapes) == 2:
  shapes = xshade.scene().active_shapes
 else :
  print("形状は2つのみ選んでください。")
  return
 dpos = dif_3d(shapes[1].center_position, shapes[0].center_position)
 print ("----")
 print ("dx = " + str(dpos[0]))
 print ("dy = " + str(dpos[1]))
 print ("dz = " + str(dpos[2]))
 print ("[dx, dy, dz] = [" + str(dpos[0]) +"," + str(dpos[1])+"," + str(dpos[2])+"]")
 print ("length = " + str(len_3d (dpos)))
 if need_check: #これは検証用コード
  scene.begin_creating()
  scene.create_line("check_line",[shapes[0].center_position,shapes[1].center_position],False)
  scene.end_creating()
  
process() 
この記事のタイトルとURLをコピーする
Translate »