FreeCADでDXFファイルからパーツを作る方法

[設定]でDXFファイルのインポート・オプションを設定する。 スケッチとジオメトリー結合をチェック [ファイル]の[インポート]で読み込むDXFファイルを選択 Shapeが読み込まれる。 ここでスケッチが出来るはずだが、出来ていない。

[Draft]に切り替えて、Shapeをすべて選択する。

[変更]から[ドラフトからスケッチへ]でスケッチを作成。

Sketchが出来上がる。

Shapeはもう不要なのですべて選択して[削除]する。

Sketchを押し出すために[ボディーを作成]を押す。

[XY_Plane]を選択して[OK]を押す。

Sketchの上にBodyが出来たので[パッド]で押し出す。

パッドパラメータに押し出し量を設定して[OK]を押す。 Partが完成する。

matplotlibで動的に描画する時はdraw_idle

matplotlibで動的に描画する時はdraw_idleを使おう。

draw_idle(*args, **kwargs)[source] Request a widget redraw once control returns to the GUI event loop. Even if multiple calls to draw_idle occur before control returns to the GUI event loop, the figure will only be rendered once.

wxPythonで自作ダイアログを表示

wxPythonでファイルダイアログ - メグタンの何でもブログ の続き

wxformbuilderでオリジナルダイアログを作成

wxformbuilderでFormsの左から3番目のDialogを追加
その下にLayoutの左端wxBoxSizerを追加
 このwxBoxSizerの中に自由にボタンとかテキストボックスを配置
その下にLayoutの左端wxBoxSizerと右から2番目のwxStdDialogButtonSizerを追加
wxStdDialogButtonSizerにはOK、Cancelボタンが配置されている。
このボタンを押すとダイアログが閉じてwx.ID_OKもしくはwx.ID_CANCELが戻される。

Generate Code で画面の.pyファイルを書き出す。
設定した対応するイベント部分を本体プログラムにコピーして修正する。
Generate Code で作成したファイルはインデントがタブなので必要に応じてスペース4個に修正

本体プログラムから呼び出す

表示前にダイアログ上に表示するデータを設定
ダイアログをOKボタンで閉じた時にはデータを読み出して保存

    def m_bDialogOnButtonClick( self, event ):
        dlg = o3dtest.MyDialog1(self)
        dlg.CenterOnScreen()
        dlg.m_textCtrl1.SetValue(self.t)
        # this does not return until the dialog is closed.
        val = dlg.ShowModal()
        if val == wx.ID_OK:
            self.t = dlg.m_textCtrl1.GetValue()
        dlg.Destroy()

pythonでgray16画像ファイルを読み込む方法

open3dでカラー画像と奥行き画像からポイントクラウドデータを作成する時に、RGB画像ファイルと16bitUINTグレー画像の読み込みが必要となる。
open3dには標準でこの読込み関数が定義されている。

import open3d as o3d
source_color = o3d.io.read_image("../../TestData/RGBD/color/00000.jpg")
source_depth = o3d.io.read_image("../../TestData/RGBD/depth/00000.png")

しかしながら

  • RGB画像ファイルはjpg

  • 奥行き画像は16bitグレーのpng

と限定されている。また、日本語のファイル名でエラーとなる。
pillowを使用し、次の様にすることで日本語ファイル名に対応して、更に16bitグレーのtiffファイルの読み込みも可能となる。

import open3d as o3d
from PIL import Image
fn1 = "../../TestData/RGBD/color/00000.jpg"
im = Image.open(fn1)
source_color = o3d.geometry.Image(np.asarray(im))  #open3d形式に変換
fn2 = "../../TestData/RGBD/depth/00000.png"
ima = Image.open(fn2)  #int32で読み込まれる
im = ima.convert("I;16")  #uint16に変換
source_depth = o3d.geometry.Image(np.asarray(im))  #open3d形式に変換

また、日本語ファイル名ではエラーとなるがopencvで読み込む時には次の様になる。

import open3d as o3d
import cv2
fn1 = "../../TestData/RGBD/color/00000.jpg"
source_color = o3d.geometry.Image(
    cv2.cvtColor(cv2.imread(fn1, -1), cv2.COLOR_BGR2RGB))
fn2 = "../../TestData/RGBD/depth/00000.png"
source_depth = o3d.geometry.Image(cv2.imread(fn2, -1))

opencvでは色の順番がBGRなので、ファイル読込後RGBへ変換している。 その後 以下のようにしてポイントクラウドを作り、表示する事が出来る。

rgbd_image = o3d.geometry.RGBDImage.create_from_color_and_depth(
    source_color , source_depth , convert_rgb_to_intensity = False)
cameraIntrinsic = o3d.camera.PinholeCameraIntrinsic(
    o3d.camera.PinholeCameraIntrinsicParameters.PrimeSenseDefault)
pcd = o3d.geometry.PointCloud.create_from_rgbd_image(
    rgbd_image , cameraIntrinsic)
# Flip it, otherwise the pointcloud will be upside down
pcd.transform([[1, 0, 0, 0], [0, -1, 0, 0], [0, 0, -1, 0], [0, 0, 0, 1]])
o3d.visualization.draw_geometries([pcd])  #表示

参考 redwood-data.org

http://redwood-data.org/