2
3

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?

More than 3 years have passed since last update.

pythonデータをcadに変換する

Last updated at Posted at 2021-03-08

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

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

インストール
pip install openpyscad 
pip3 install openpyscad #python3
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/

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

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

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

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として出力しました.

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

2
3
0

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
2
3

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?