pythonデータをcadに変換する

##はじめに
pythonで計算した点のデータをcadとして保存したいと思い,
方法をまとめました.

##pythonデータをcadに変換する
openpyscadというライブラリを使用します.

```bash:インストール
pip install openpyscad 
pip3 install openpyscad #python3
```



```python:cad.py
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/

https://tigersans.wordpress.com/2018/03/28/meshlab/

https://qiita.com/iwtn/items/b984519ad24ac3c7d7d5

https://openjscad.org/

##追記
しかし上記の方法ではデータを329個までしか生成できず,330個生成使用とすると以下のようなエラーが出て失敗することが判明しました.

```python:test_cad.py
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

```

調べると以下の様な方法で回避できるとなっており、少し回数を増やすことができました.
しかし,あまり増やしすぎるとまたうまく行きませんでした...


https://qiita.com/wifecooky/items/348da636f456a00120db

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);
                };
            };
        };
    };
};
```

解決するには埋め込んでいく様なやり方を変えるのが良さそうです...
そこで埋め込みが発生しないようにファイル出力の部分は自分で作成しました.
そして100*100*100個の点をscadとして出力しました.

```python:cad2.py
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のファイルは開けませんでした....