なんで Docker で GUI アプリを動かすのか。
CadQuery で 3D モデリングがしたい。
しかし、Anaconda でしか使えない。ホストマシンに Anaconda 入れたくない。
Docker でやってみよう。
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 はライブラリ。GUI は別。
どちらもエディタとビューアが付いている。CQ-Editor は外部エディタが使える。
import cadquery
height = 60.0
width = 80.0
thickness = 10.0
result = cadquery.Workplane("XY").box(height, width, thickness)
import IPython.display
svg = result.toSvg()
IPython.display.SVG(svg)
diameter = 22.0
result = result.faces(">Z").workplane().hole(diameter)
svg = result.toSvg()
IPython.display.SVG(svg)
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())
svg = result.toSvg()
IPython.display.SVG(svg)
ホストマシンは Linux Mint です。
.
├── containers
│ └── cq-editor
│ └── Dockerfile
└── docker-compose.yaml
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
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"]
インストール
sudo apt install xserver-xephyr
起動
Xephyr -resizeable :1
番号を、コンテナの環境変数 DISPLAY
と X サーバの引数で一致させる。
Mac ではやったことがありましたが、Linux はまた違って苦労しました。
環境変数 DISPLAY
を渡してやること。UNIX ソケットのデバイスファイル /tmp/.X11-unix
をマウントしてやることが必要です。
色々不便はありますが、3D モデリングが始められるようになりました。