Shade3D 公式

カーソル位置に0倍

python
Tags: #<Tag:0x00007f9338c5ba98>

#1

初めまして。motcruと申します。
スクリプトの知識はほとんど無いのですが、以下のようなものを書いてみました。

cur = xshade.scene().current_cursor_position
curx = cur[0]
cury = cur[1]
curz = cur[2]
xshade.scene().move_object([curx,cury,curz], [0, 1, 1], None, None)

カーソル位置x方向に0倍するはずだと思うのですが、
実行すると、ピッタリ0倍にならず微妙にずれます。
何がいけないのでしょうか?御指南いただけましたら幸いです。
よろしくお願いします。


#2

こんにちは
current_cursor_positionは図面上のカーソル位置なので、形状の選択状態によっては位置がずれる場合があります。
図面でクリックした位置のcursor_positionをお試しください。

cur = xshade.scene().cursor_position
xshade.scene().move_object( cur, [ 0, 1, 1 ], None, None )


#3

でったさん、早速のご返信ありがとうございます。

かなり拡大しなければ判らないのですが、やはり微妙にずれるようです。
見かけ上そうなっているだけかも?、とも思うのですが、
CAD上がりのせいか、どうも気持ち悪くて・・・

普段はトランスフォーメーションボックスから0倍していまして、その場合はピッタリ揃います。


#4

記載されている内容はあっており、
scene().move_objectを確認したところ、scale値は元形状のサイズの1/5000以下にはならないような挙動をしているように感じます(scriptでのバグ?)。

  1. 半径500の球を配置して選択
  2. cur = xshade.scene().cursor_position
    xshade.scene().move_object(cur, [0, 1, 1], None, None)
    を実行
  3. 半径は0.0ではなく、0.1になっている。

#5

検証ありがとうございます。
おぼろげな記憶で申し訳ありませんが、Pythonでの精度の絡みだったような気もします。
この問題は開発部へ回し改めてご回答させていただきます。


#6

y_yutakaさん、
なるほどそういうことなんですね。ありがとうございます。

でったさん
ありがとうございます。またよろしくお願いします。


#7

scale 値が 0 になっていないのは、大昔の undo 対策のためだったと記憶しています。

まだ残っていたのですね。


#8

開発部に確認しました。
加藤さんのおっしゃる通り、アンドゥ用に最小値が0にならないようにしてあるとのこと。
現時点ではこれは仕様となっています。

差分の無い0倍は、shapeクラスのmove_objectで行えます。こちらは実行後のアンドゥが無効となっています。

shapeクラスのmove_objectでは形状の中心に対しての変形となりますので、別途形状の中心とカーソル位置の差分を求めておきます。

カーソル位置にX軸で0倍するスクリプトは以下のようになります。
cur = xshade.scene().cursor_position
center = xshade.scene().active_shape().center_position
xn = cur[ 0 ] - center[ 0 ]
xshade.scene().active_shape().move_object(((0,0,0,0),(0,1,0,0),(0,0,1,0),(xn,0,0,1)))

引数で与える行列は倍率と移動だけで言いますと
((A,0,0,0),(0,B,0,0),(0,0,C,0),(D,E,F,1))
A = Xの倍率
B = Yの倍率
C = Zの倍率
D = Xの移動量
E = Yの移動量
F = Zの移動量
となっています。

ご参考までに、まったく変倍も移動も回転も行わない行列(単位行列)は
((1,0,0,0),(0,1,0,0),(0,0,1,0),(0,0,0,1))
となります。


#9

dettaさん、ご足労をお掛けし申し訳ございません。
やはり、コントロールポイントも編集したいのと、アンドゥはあった方がいいので、
今までのようにトランスフォーメーションボックスで作業します。
皆様、色々とありがとうございました。