Skip to content
Snippets Groups Projects
read_old_paperbot.py 2.87 KiB
Newer Older
Jingyan Ling's avatar
Jingyan Ling committed
#!/usr/bin/env python3
import numpy as np
import ezdxf 
import random
from math import sqrt
import copy
# from roco_ee_dwg_processing import *
Jingyan Ling's avatar
Jingyan Ling committed


class read_old_paperbot():
    def __init__(self,dxf_file):
        self.dwg=ezdxf.readfile(dxf_file)
        self.msp=self.dwg.modelspace()
        
        self.create_layer('Cut',5)
        self.create_layer('Circuit',1)
        self.create_layer('Label',3)
        self.create_layer('Fold',4)
        self.create_layer('Pin_temp',6)
        
        self.layer_rearrange() ## reagrrange cut and fold lines to corresponding layers
        self.remove_wheels() ##remove wheel drawings for this design, no need to call for other designs
        self.center_arr=self.find_pin()
        
        # cross_cut(self.msp,2,self.center_arr)
        self.savename='dwg_w_layers.dxf'
        self.dwg.saveas(self.savename)
    
    def create_layer(self,layer_name,color):
        if not layer_name in self.dwg.layers:
            self.dwg.layers.new(name=layer_name,dxfattribs={'color':color})

    def layer_rearrange(self):
        # put fold lines to the new layer 'Fold'
        # put cut lines to the new layer 'Cut
        for e in self.msp.query('LINE'):
            if e.dxf.color!=5:
                e.dxf.layer='Fold'
            else:
                e.dxf.layer='Cut'
    def remove_wheels(self):
        #no need to call this function for other design
        for e in self.msp.query('Arc LINE[layer=="Cut"]'):
            if e.dxf.start[0]>=179:
                self.msp.delete_entity(e)

    def find_pin(self):
        tolerance=0.05 #mm
Jingyan Ling's avatar
Jingyan Ling committed
        pincutsize_big=3 #mm
        pincutsize_small=1 #mm
        pin_edge_arr=np.array([[0,0],[0,0]]).reshape(1,2,2)
        center_arr=np.array([[0,0]])

        for e in self.msp.query('LINE[layer=="Cut"]'):
            length= sqrt((e.dxf.start[0]-e.dxf.end[0])**2+(e.dxf.start[1]-e.dxf.end[1])**2)
Jingyan Ling's avatar
Jingyan Ling committed
            if length > pincutsize_small-tolerance and length < pincutsize_big + tolerance:
                e.dxf.layer='Pin_temp'
Jingyan Ling's avatar
Jingyan Ling committed
                self.msp.delete_entity(e) #08/13/2019 remove all pins in mechanical desing
                if e.dxf.start[1]==e.dxf.end[1]: ##this line is horizontal
                    pin_edge=np.array([e.dxf.start,e.dxf.end])[:,:2]
                    pin_edge_arr=np.concatenate((pin_edge_arr,pin_edge.reshape(1,2,2)),axis=0)
        pin_edge_arr=pin_edge_arr[1:]
        # print(pin_edge_arr)
        
        for i in range(len(pin_edge_arr)):
            for e in np.delete(pin_edge_arr,i,axis=0):
                if pin_edge_arr[i][0,1]-e[0,1]==1.0:
                    center_x=pin_edge_arr[i][0,0]-0.5
                    center_y=pin_edge_arr[i][0,1]-0.5
                    center=np.array([center_x,center_y]).reshape(1,2)
                    center_arr=np.append(center_arr,center,axis=0)

        center_arr=np.unique(center_arr,axis=0)
        center_arr=center_arr[1:]
        return center_arr