興味があろうがなかろうが。

なるべく役に立つ、とがった内容を記していきたいと思います。

【FreeCADプログラミング】要素の表示・非表示

本日のお題は『要素の表示・非表示』です。

先日、Selection APIによる要素の取得方法をご紹介しましたので、今回は取得した要素に対して、処理をしてみたいと思います。

1. 環境

環境はいつもどおり、FreeCADのみです。必要に応じて、Visual Studio Codeを用意し、デバッグをしてください。

  • FreeCAD 0.18

2. 表示・非表示する方法

要素の表示状態を変更するAPIが用意されています。

具体的には表示・非表示にはViewObject APIのshow()とhide()を利用します。

ロジック的なものはありませんが、ややこしい点として、取得した要素からViewObjectを取得しなければなりません

※ 正直、私はオブジェクトの階層構成はまだほとんど理解できていません。何かご指摘があればコメントをよろしくお願いします。

3. プログラムを書いてみよう

Selection APIを使って要素を取得し、その中からViewObjectを取り出して表示・非表示を行います。

3.1. 非表示のプログラム

要素の非表示にはhide()を使用します。

# -*- coding: utf-8 -*-

import FreeCAD
import FreeCADGui

sel = FreeCADGui.Selection.getSelection()

if(len(sel) != 0):
    sel[0].ViewObject.hide()

3.2. 表示のプログラム

要素の表示にはshow()を使用します。

# -*- coding: utf-8 -*-

import FreeCAD
import FreeCADGui

sel = FreeCADGui.Selection.getSelection()

if(len(sel) != 0):
    sel[0].ViewObject.show()

4. 実行方法

4.1. 非表示のプログラムの実行方法

下図のように、直方体が1つ配置されたモデルを仮に用意しています。

f:id:appli-get:20191015191129p:plain

プログラム実行前の状態(padを選択した状態)

まずは、左側にあるコンボビューから『pad』を選択します。選択すると、グラフィックビュー上の要素がハイライトされます。

この状態で、3.1.で作ったプログラムを実行してください。

問題なく進めば、緑色にハイライトされている直方体が非表示になるはずです。

4.2. 表示のプログラムの実行方法

今度は表示プログラムの実行です。

hideの時と同じように、今度は非表示状態になった『pad』を選択します。

f:id:appli-get:20191015191138p:plain

プログラム実行前の状態(非表示状態のpadを選択している状態)

この状態で3.2.で作ったプログラムを実行してください。

問題なく進めば、非表示状態になっていた『pad』が表示状態になるはずです。

5. 補足

5.1. 取得したオブジェクトに直接、show()もしくはhide()を実行したらどうなるか

一応、気になる方もいらっしゃると思い、試しました。

例えば、サンプルプログラムの『sel[0].ViewObject.hide()』を『sel[0].hide()』に変えてみると、以下のエラーが発生します。

<type 'exceptions.AttributeError'>: 'PartDesign.Feature' object has no attribute 'hide' 

Pythonはあまり詳しくないですが、とりあえずPartDesign.Featureクラスにはhideなんていうメソッドは無いと言っているようですね。

4. まとめ

  • 要素の表示にはViewObject APIのshow()を使う
  • 要素の非表示にはViewObject APIのhide()を使う
  • ViewObjectのAPIを使うには、選択した要素からViewObjectを取得する必要がある

5. 最後に

実はViewObjectを取得する方法は、APIリファレンスから探ったわけではなく、デバッグで探しました。

おそらく、さらに深い機能を探るには、デバッグができないと難しいでしょうね。

更なる情報をお探しの方は!

下記のリンクから、FreeCADプログラミングのトップページに飛びます。

よろしければご参照くださいませ。

www.interested-or-not.com