Metasequoia BBS

| New message | Normal | Tree |
Status
Tag
Keyword
[8489] オブジェクトリストの位置を操作する方法 / まじかる☆しげぽん
[Question] Response
現在、オブジェクトをソートするスクリプトを書いているのですが
オブジェクトの順番操作が上手くいかず、ソートしたリスト情報を基に一度複製して元のオブジェクトを消すという処理で対処しています。
しかし、オブジェクトを複製して消すというのがただオブジェクトをソートするだけで行いたくなく、順番を操作する方法は無いでしょうか?

>insertObject(obj, brother)
insertObjectがその操作を行うメソッドかと思ったのですがbrotherという兄弟オブジェクトが良く分かりません。
brotherにカレントオブジェクトやオブジェクトの一番目のオブジェクトを指定したりしたのですが順番が入れ替わったりしませんがインサートの自分の認識が間違ってるでしょうか?

>addObject(obj[, parent])
addObjectで、既存のオブジェクトを同じようにカレントオブジェクトや1番目のオブジェクトに親子付けしようとしたのですがこれも上手く動作しない感じです。

cloneして追加したオブジェクトの親子付けは行えましたが、すでにあるオブジェクトの順番を入れ替えるような手段は複製したりする以外無いのでしょうか?

以下コードです。

doc = MQSystem.getDocument()

objList= []
listName = []
sort_list = []

Show more...
2019-12-13 03:59
[8490] Re: オブジェクトリストの位置を操作する方法 / まじかる☆しげぽん
あと、このように一括でオブジェクトを削除しようとするとかなりの確率でメタセコが落ちてしまうのですが、ジェネレーターなどで連続処理をタスクを分けた方がいいのでしょうか?
# 複製前のオブジェクト削除
            for i, obj3 in enumerate(objList):
                if obj3 is not None:
                    doc.deleteObject(i)
2019-12-13 10:48
[8491] Re: オブジェクトリストの位置を操作する方法 / Administrator
insertObjectは既にドキュメントに追加済みのものを再挿入することはできません。順番を入れ替えるには、割と最近(確か4.7.1くらい)に追加されたMQDocument.removeObject()メソッドを利用して下さい。オブジェクトを削除せずにドキュメントから外せるので、addObjectかinsertObjectで再追加可能です。

落ちる原因は現時点では断定できませんが、そのコードでは元々Noneが入っているとobjList内とインデックスが一致しませんので、そのせいではないかという気がします。print()でインデックスを表示するなどしながら、入念にデバッグしてください。
プラグインに比べてスクリプトのほうがエラー時にも通常はログにエラー出力するだけで済むなど比較的安全なのですが、実行速度重視で引数などがおかしくないかチェックしていない箇所もあるので、変なインデックスや削除済みのものにアクセスしようとしたときに異常終了してしまうこともあります。
2019-12-13 16:47
[8492] Re: オブジェクトリストの位置を操作する方法 / まじかる☆しげぽん
返信ありがとうございます。removeObjectはどう活用すればいいのかと思ってたので参考になります。

一応確認したいのですが、indexと説明されてる部分とオブジェクトのユニークIDは別物という認識で大丈夫でしょうか?
自分が読み取ったイメージでは、indexはオブジェクトリストの順番にならんでいる番号。
ユニークIDはオブジェクトが持ってる固有番号と認識しました。

また、Noneになるのを確認したいのですが
removeObject > Noneとしてシーンに残る
deleteObject > Noneにもならず完全にシーンから消えるという認識で会ってるでしょうか?

removeObjectでリストから外した場合、indexはNoneを返すと書いてあるのですが、再びinsertする場合は何を手掛かりにobjに渡せばいいのでしょうか。
doc.objectでオブジェクトのリストを取得した場合は、Noneを返しますし。
IDを取得した場合も同様にNoneTypeと返されてしまい。目的のオブジェクトを再取得できないように感じます。

例えば、メタセコで以下のようなコードを実行するとNoneオブジェクトがNoneTypeと出ます

for obj in doc.object:
    print(obj.name)

Failed to execute a script in line 6, 'test.py'.

Show more...
2019-12-13 17:42
[8493] Re: オブジェクトリストの位置を操作する方法 / まじかる☆しげぽん
また、以下のようにオブジェクトを取得した際に、 何もしていないのにatの後の部分が毎回異なるのですがそれは仕様でしょうか?
for obj in doc.object:
    print(obj)
1回目
<MQObject object at 0x022991A0>
<MQObject object at 0x02299280>
<MQObject object at 0x022991A0>
None
None
None
None
<MQObject object at 0x022991A0>
<MQObject object at 0x02299280>
<MQObject object at 0x022991A0>
<MQObject object at 0x02299280>
<MQObject object at 0x022991A0>
<MQObject object at 0x02299280>
<MQObject object at 0x022991A0>
<MQObject object at 0x02299280>
<MQObject object at 0x022991A0>

Show more...
2019-12-13 17:48