2021-08-28 Python駿河 勉強会 #28 ~真夏のLT大会~ https://py-suruga.connpass.com/event/222048/

夏休みの自由研究¶

Docker で GUI アプリを動かしました。

四年三組 なかだじゅんや https://junyanakada.com/

おまえだれよ¶

中田順也と言います。

湘南(茅ヶ崎)に住んでます。職場も。

プログラマ二年生です。最近は、Django で苦しんでます。

静岡市の生まれです。

ものづくりしたいです。

動機¶

なんで Docker で GUI アプリを動かすのか。

CadQuery で 3D モデリングがしたい。

しかし、Anaconda でしか使えない。ホストマシンに Anaconda 入れたくない。

Docker でやってみよう。

CadQuery とは¶

https://cadquery.readthedocs.io/en/latest/

CadQuery is an intuitive, easy-to-use Python library for building parametric 3D CAD models.

CadQueryは、パラメトリック3DCADモデルを構築するための直感的で使いやすいPythonライブラリです。

CadQuery はライブラリ¶

CadQuery はライブラリ。GUI は別。

  • CQ-editor(Qt)
  • jupyter-cadquery(Jupyter Lab)

どちらもエディタとビューアが付いている。CQ-Editor は外部エディタが使える。

Examples¶

In [1]:
import cadquery

height = 60.0
width = 80.0
thickness = 10.0

result = cadquery.Workplane("XY").box(height, width, thickness)
In [2]:
import IPython.display

svg = result.toSvg()
IPython.display.SVG(svg)
Out[2]:
X Y Z
In [3]:
diameter = 22.0

result = result.faces(">Z").workplane().hole(diameter)
In [4]:
svg = result.toSvg()
IPython.display.SVG(svg)
Out[4]:
X Y Z

サイクロイド歯車¶

https://cadquery.readthedocs.io/en/latest/examples.html#cycloidal-gear

In [5]:
import cadquery as cq
from math import sin, cos, pi, floor

# define the generating function
def hypocycloid(t, r1, r2):
    return ((r1-r2)*cos(t)+r2*cos(r1/r2*t-t), (r1-r2)*sin(t)+r2*sin(-(r1/r2*t-t)))

def epicycloid(t, r1, r2):
    return ((r1+r2)*cos(t)-r2*cos(r1/r2*t+t), (r1+r2)*sin(t)-r2*sin(r1/r2*t+t))

def gear(t, r1=4, r2=1):
    if (-1)**(1+floor(t/2/pi*(r1/r2))) < 0:
        return epicycloid(t, r1, r2)
    else:
        return hypocycloid(t, r1, r2)

# create the gear profile and extrude it
result = (cq.Workplane('XY').parametricCurve(lambda t: gear(t*2*pi, 6, 1))
    .twistExtrude(15, 90).faces('>Z').workplane().circle(2).cutThruAll())
In [6]:
svg = result.toSvg()
IPython.display.SVG(svg)
Out[6]:
X Y Z

Docker で GUI アプリを動かす¶

ホストマシンは Linux Mint です。

ディレクトリ¶

.
├── containers
│   └── cq-editor
│       └── Dockerfile
└── docker-compose.yaml

Dockerfile¶

FROM continuumio/miniconda3

RUN apt-get update
RUN apt-get install -y libgl1-mesa-glx
RUN apt-get clean
RUN rm -rf /var/lib/apt/lists/* /tmp/* /var/tmp/*

RUN conda install -c conda-forge -c cadquery cadquery cq-editor
RUN conda clean -a -y

docker-compose.yaml¶

version: "3"
services:
  cq-editor:
    build:
      context: .
      dockerfile: containers/cq-editor/Dockerfile
    image: cq-editor:latest
    container_name: cq
    environment:
      - DISPLAY=:1  # X サーバ
      - QT_DEBUG_PLUGINS=1
    volumes:
      - /tmp/.X11-unix:/tmp/.X11-unix  # Unix socket
      - ./:/tmp/cadquery/
    working_dir: /tmp/cadquery
    command: ["cq-editor"]

X サーバ¶

インストール

sudo apt install xserver-xephyr

起動

Xephyr -resizeable :1

番号を、コンテナの環境変数 DISPLAY と X サーバの引数で一致させる。

起動¶

X サーバを先に動かしてから、

docker-compose up

まとめ¶

Mac ではやったことがありましたが、Linux はまた違って苦労しました。

環境変数 DISPLAY を渡してやること。UNIX ソケットのデバイスファイル /tmp/.X11-unix をマウントしてやることが必要です。

色々不便はありますが、3D モデリングが始められるようになりました。