##はじめに
pythonで計算した点のデータをcadとして保存したいと思い,
方法をまとめました.
##pythonデータをcadに変換する
openpyscadというライブラリを使用します.
pip install openpyscad
pip3 install openpyscad #python3
import openpyscad as ops
def add_point(x,y,z):
c = ops.Cube([0.1, 0.1, 0.1],center=True).translate([x,y,z])
return c
def list_to_cad(data):
for i in range(len(data)):
print(i)
if i == 0:
cad = add_point(data[i][0],data[i][1],data[i][2])
else:
cad = add_point(data[i][0],data[i][1],data[i][2]) + cad
return cad
data = [[1,0,0],[2,0,0],[3,0,0]]
cad = list_to_cad(data)
(cad).write("point.scad")
以下サイトでscadをstlに変換すればOK
https://anyconv.com/ja/scad-to-stl-konbata/
以下サイトでstlを可視化できる
https://www.viewstl.com/
##参考
チートシート
https://www.openscad.org/cheatsheet/
##追記
しかし上記の方法ではデータを329個までしか生成できず,330個生成使用とすると以下のようなエラーが出て失敗することが判明しました.
import openpyscad as ops
def add_point(x,y,z):
c = ops.Cube([0.1, 0.1, 0.1],center=True).translate([x,y,z])
return c
def list_to_cad(data):
for i in range(len(data)):
print(i)
if i == 0:
cad = add_point(data[i][0],data[i][1],data[i][2])
else:
try:
cad = add_point(data[i][0],data[i][1],data[i][2]) + cad
except:
print("error")
return cad
data = []
for i in range(330):
data.append([0,0,0])
cad = list_to_cad(data)
print(cad)
(cad).write("point.scad")
children=self._get_children_content(indent_level + 1, fp=fp),
File "/home/hoshina/.local/lib/python3.8/site-packages/openpyscad/base.py", line 162, in _get_children_content
_content += child.dumps(indent_level, fp)
File "/home/hoshina/.local/lib/python3.8/site-packages/openpyscad/base.py", line 208, in dumps
params=self._get_params(fp).replace('True', 'true'),
File "/home/hoshina/.local/lib/python3.8/site-packages/openpyscad/base.py", line 154, in _get_params
args += ' '.join(map(lambda x: '{}={},'.format(convert_special_args(x), _get_attr(self, x, fp)), kw_args))[:-1]
File "/home/hoshina/.local/lib/python3.8/site-packages/openpyscad/base.py", line 153, in <lambda>
kw_args = filter(lambda x: is_keyword_args(x), valid_keys)
File "/home/hoshina/.local/lib/python3.8/site-packages/openpyscad/base.py", line 110, in is_keyword_args
return not is_no_keyword_args(arg_name)
File "/home/hoshina/.local/lib/python3.8/site-packages/openpyscad/base.py", line 105, in is_no_keyword_args
if arg_name[0] == '_' and arg_name[1] == '_':
RecursionError: maximum recursion depth exceeded in comparison
調べると以下の様な方法で回避できるとなっており、少し回数を増やすことができました.
しかし,あまり増やしすぎるとまたうまく行きませんでした...
5回繰り返したときのscad形式のデータは以下のようになりunion()の中にunion()が埋め込まれていることがわかります.
union(){
translate(v=[0, 0, 0]){
cube(size=[0.1, 0.1, 0.1], center=true);
};
union(){
translate(v=[0, 0, 0]){
cube(size=[0.1, 0.1, 0.1], center=true);
};
union(){
translate(v=[0, 0, 0]){
cube(size=[0.1, 0.1, 0.1], center=true);
};
union(){
translate(v=[0, 0, 0]){
cube(size=[0.1, 0.1, 0.1], center=true);
};
translate(v=[0, 0, 0]){
cube(size=[0.1, 0.1, 0.1], center=true);
};
};
};
};
};
解決するには埋め込んでいく様なやり方を変えるのが良さそうです...
そこで埋め込みが発生しないようにファイル出力の部分は自分で作成しました.
そして100100100個の点をscadとして出力しました.
import openpyscad as ops
def add_point(x,y,z):
c = ops.Cube([0.1, 0.1, 0.1],center=True).translate([x,y,z])
return c
def list_to_cad(data,file_name):
f=open(file_name,'w')
f.write('union(){\n')
for i in range(len(data)):
c = add_point(data[i][0],data[i][1],data[i][2])
f.write(str(c))
f.write('};\n')
f.close()
points = []
for i in range(100):
for j in range(100):
for k in range(100):
points.append([i,j,k])
list_to_cad(points,"test.scad")
しかし出力されたファイルのサイズは72MBで,オンラインでscadからstlに変換してくれるものが見つからず,
OpenSCADをインストールして試してみました.
sudo apt-get -y install openscad
しかし,OpenSCADでも72MBのファイルは開けませんでした....