def StartPanel(self, panel): '''Метод вызывается автоматически перед началом обработки каждой панели''' self.millingTech = [] self.drills=[] self.slots = [] # Пропилы self.millingSlots = [] self.workingsides=[] # Список сторон панели, которые нужно будет обработать self.writer=Writer() self.isSlotsFX = False self.isSlotsFY = False self.isSlotsAY = False self.isBlindHoleF = False self.fname="" # Имя файла управляющей программы self.panelName=panel.name self.panel = panel b = self.panel.bounding_box self.NumOrder = '' self.Selobj = 0 for a in self.panel.attributes: if a.name=='Selobj': self.Selobj = int(a.value) if a.name=='NumOrder': self.NumOrder = str(a.value)+"_" # Анализируем габарит панели и поворачиваем ее длинной стороной вдоль X #Xpanel=b.max.x-b.min.x #Ypanel=b.max.y-b.min.y self.panel.Translate(machine.Vector2d(-b.min.x,-b.min.y)) self.panelThickness = panel.thickness self.panelWidth = self.panel.panel_width self.panelLength = self.panel.panel_length self.panelNum = panel.common_pos # Собираем контура self.Contour() return True
def StartPanel(self, panel): '''Метод вызывается автоматически перед началом обработки каждой панели''' # self.millingTech = [] # self.drills=[] # self.slots = [] # Пропилы # self.workingsides=[] # Список сторон панели, которые нужно будет обработать self.fname = "" # Имя файла управляющей программы #self.panelName=panel.name self.panel = panel b = self.panel.bounding_box # print (os.path.split(self.settings.database_name)[1]) a = os.path.split(self.settings.database_name)[1] # b=a.split('.') # print (b) self.NumOrder = a.split('.')[0] #"" #self.settings.database_name self.Selobj = 0 for a in self.panel.attributes: if a.name == 'Selobj': self.Selobj = int(a.value) if a.name == 'NumOrder': self.NumOrder = str(a.value) + "_" # Анализируем габарит панели и поворачиваем ее w = 0 if abs(self.panel.bounding_box.size_x-self.panel.detail.bounding_box.size_x) +\ abs(self.panel.bounding_box.size_y-self.panel.detail.bounding_box.size_y) >\ abs(self.panel.bounding_box.size_x-self.panel.detail.bounding_box.size_y) +\ abs(self.panel.bounding_box.size_y-self.panel.detail.bounding_box.size_x): self.panel.Rotate(0.5 * vpi, self.panel.bounding_box.min) w = self.panel.bounding_box.max.x - self.panel.bounding_box.min.x self.panel.Translate( machine.Vector2d(w + self.panel.detail.bounding_box.min.x, self.panel.detail.bounding_box.min.y)) b = self.panel.bounding_box if b.min.x < xmin - eps_d or b.max.x > xmax + eps_d: print("Панель #", self.panel.common_pos, " (", panel.name, ") не проходит по габаритам X(", b.min.x, "-", b.max.x, ")") print("Габариты панели: ", b.max.x - b.min.x, b.max.y - b.min.y) return if b.min.y < ymin - eps_d or b.max.y > ymax + eps_d: print("Панель #", self.panel.common_pos, " (", panel.name, ") не проходит по габаритам Y(", b.min.y, "-", b.max.y, ")") print("Габариты панели: ", b.max.x - b.min.x, b.max.y - b.min.y) return # p0 = self.panel.bounding_box.min # p0.x = 0 # p0.y = 0 # self.panel.Rotate(0.5*vpi, p0) self.panelThickness = panel.thickness self.panelWidth = self.panel.panel_width self.panelLength = self.panel.panel_length self.panelNum = panel.common_pos self.writer.panelName = panel.name # Собираем контура self.Contour() return True
def lengSegment(con): '''Возвращает длину сегмента или None''' res=None if type(con)==machine.Arc: v1 =con.tangent(1) v2 =con.tangent(0) res=vpi*con.radius*(angleGet(v1, v2))/180 elif type(con)==machine.Line: vx=con.end_pt.x-con.start_pt.x vy=con.end_pt.y-con.start_pt.y vt=machine.Vector2d(vx,vy) res=vt.length return res
def TransformToSide(self, panel, posit, toback=False): '''Функция устанавливает положение панели panel в соответствие с заданной сторонй posit. Если toback = True, то положение возвращается из posit в стандартное (АЕ) Если передено корректное положение, то функция возвращает True. Иначе - False ''' b = panel.bounding_box ypanel = b.max.x - b.min.x ypanel = b.max.y - b.min.y matr = machine.Matrix3d() # Добавляем в матрицу преобразования в зависимости от положенияя if posit == "AE": pass # Это нормальное положение панели elif posit == "AC": matr = machine.Matrix3d.rotate(vpi / 2) matr *= machine.Matrix3d.translate(machine.Vector2d(-ypanel, 0)) elif posit == "AD": matr = machine.Matrix3d.rotate(vpi) matr *= machine.Matrix3d.translate( machine.Vector2d(-xpanel, -ypanel)) elif posit == "AB": matr = machine.Matrix3d.rotate(-vpi / 2) matr *= machine.Matrix3d.translate(machine.Vector2d(0, -xpanel)) elif posit == "FE": matr = machine.Matrix3d.overturn_y(0, panel.thickness / 2) matr *= machine.Matrix3d.translate(machine.Vector2d(-xpanel, 0)) elif posit == "FC": matr = machine.Matrix3d.overturn_y(0, panel.thickness / 2) matr *= machine.Matrix3d.rotate(vpi / 2) elif posit == "FD": matr = machine.Matrix3d.overturn_y(0, panel.thickness / 2) matr *= machine.Matrix3d.rotate(vpi) matr *= machine.Matrix3d.translate(machine.Vector2d(0, -ypanel)) elif posit == "FB": matr = machine.Matrix3d.overturn_y(0, panel.thickness / 2) matr *= machine.Matrix3d.rotate(-vpi / 2) matr *= machine.Matrix3d.translate( machine.Vector2d(-ypanel, -xpanel)) else: return False # Если нужно восстановить положение, то инвертируем матрицу if toback: matr.inverse() panel.Transform(matr) return True
def CheckConstraints(self,operation, listDrillDimMashine=['B', 'C', 'D', 'E', 'A', 'F']): '''Определение положения панели, при котором данная операция может быть выполнена operation - операция self - ограничения станка Функция возвращает кортеж положений панели вида <Plane><Side>, где <Plane> - пласть панели, расположенная вверху (А или F) <Side> - сторона панели, расположенная вперед (B, C, D, E) ''' poslist=[] # Список положений if not isinstance(operation,machine.Operation): return tuple(poslist) # Проверяем габариты по Z. Если не проходит, то ничего не поможет panel=operation.panel # Панель операции b=panel.bounding_box #ypanel=bbox.max.y-bbox.min.y #xpanel=bbox.max.x-bbox.min.x xpanel, ypanel = GetGab_bounding_box(panel) if (panel.thickness>=self.zmax_constr or panel.thickness<=self.zmin_constr): return tuple(poslist) # Проверяем отверстия xmin=self.xmin_constr xmax=self.xmax_constr ymin=self.ymin_constr ymax=self.ymax_constr if isinstance(operation,machine.Drilling): position=operation.position matr3d=machine.Matrix3d() matr3d.translate(machine.Vector2d(-b.min.x,-b.min.y)) position.transform(matr3d) x=operation.position.x y=operation.position.y side=GetDrillPlane(operation) if side=="X": return tuple(poslist) # print('side=',side) # Проверяем пласти панели if ((operation.depth>=panel.thickness and side=="F") or side=="A"): # Проверяем сторону А if self._CheckPositGabs(xmin,xmax,ymin,ymax,x,y): self.AppendPosition(poslist,"AE") if self._CheckPositGabs(xmin,xmax,ymin,ymax,ypanel-y,x): self.AppendPosition(poslist,"AC") if self._CheckPositGabs(xmin,xmax,ymin,ymax,y,xpanel-x): self.AppendPosition(poslist,"AB") if self._CheckPositGabs(xmin,xmax,ymin,ymax,xpanel-x,ypanel-y): self.AppendPosition(poslist,"AD") if ((operation.depth>=panel.thickness and side=="A") or side=="F"): # Если отверстие сквозное или сторона F if self._CheckPositGabs(xmin,xmax,ymin,ymax,xpanel-x,y): self.AppendPosition(poslist,"FE") if self._CheckPositGabs(xmin,xmax,ymin,ymax,y,x): self.AppendPosition(poslist,"FC") if self._CheckPositGabs(xmin,xmax,ymin,ymax,ypanel-y,xpanel-x): self.AppendPosition(poslist,"FB") if self._CheckPositGabs(xmin,xmax,ymin,ymax,x,ypanel-y): self.AppendPosition(poslist,"FD") if (side=="B"): # Проверяем сторону B if ((y <= (eps_d + ymax)) and ((y +eps_d) >= ymin) and ('B' in listDrillDimMashine)): self.AppendPosition(poslist,"AE") if (((ypanel-y)<= (eps_d + xmax)) and ((ypanel-y) +eps_d >= xmin) and ('D' in listDrillDimMashine)): self.AppendPosition(poslist,"AC") if ((y <= (eps_d + xmax)) and ((y +eps_d) >= xmin) and (xpanel <= (eps_d + ymax)) and ('E' in listDrillDimMashine)): self.AppendPosition(poslist,"AB") if (((ypanel-y) <= (eps_d + ymax)) and (((ypanel-y) +eps_d) >= ymin) and (xpanel <= (eps_d + xmax)) and ('C' in listDrillDimMashine)): self.AppendPosition(poslist,"AD") if ((y <= (eps_d + ymax)) and ((y +eps_d) >= ymin) and (xpanel <= (eps_d + xmax)) and ('C' in listDrillDimMashine)): self.AppendPosition(poslist,"FE") if ((y <= eps_d + xmax) and (y+eps_d >= xmin) and ('C' in listDrillDimMashine)): self.AppendPosition(poslist,"FD") if (((ypanel-y) <= (eps_d + xmax)) and (((ypanel-y) +eps_d) >= xmin) and ((xpanel) <= (eps_d + ymax)) and ('D' in listDrillDimMashine)): self.AppendPosition(poslist,"FB") if (((ypanel-y) <= (eps_d + ymax)) and (((ypanel-y) +eps_d) >= ymin) and ('E' in listDrillDimMashine)): self.AppendPosition(poslist,"FC") if (side=="C"): # Проверяем сторону C if (y<= eps_d + ymax and y+eps_d >= ymin and xpanel<= xmax and ('C' in listDrillDimMashine)): self.AppendPosition(poslist,"AE") if (((ypanel-y)<= (eps_d + xmax)) and ((ypanel-y)+eps_d) >= xmin and (xpanel<= (eps_d + ymax)) and ('E' in listDrillDimMashine)): self.AppendPosition(poslist,"AC") if ((y<= (eps_d + xmax)) and ((y+eps_d) >= xmin) and ('D' in listDrillDimMashine)): self.AppendPosition(poslist,"AB") if (((ypanel-y)<= (eps_d + ymax)) and (((ypanel-y)+eps_d) >= ymin) and ('B' in listDrillDimMashine)): self.AppendPosition(poslist,"AD") if ((y<= (eps_d + ymax)) and ((y+eps_d) >= ymin) and ('B' in listDrillDimMashine)): self.AppendPosition(poslist,"FE") if ((y<= eps_d + xmax) and (y+eps_d >= xmin) and (xpanel<= eps_d + ymax) and ('E' in listDrillDimMashine)): self.AppendPosition(poslist,"FC") if ((ypanel-y<= eps_d + xmax) and (ypanel-y+eps_d >= xmin) and ('D' in listDrillDimMashine)): self.AppendPosition(poslist,"FB") if ((ypanel-y<= eps_d + ymax) and (ypanel-y+eps_d >= ymin) and (xpanel<= eps_d + xmax) and ('C' in listDrillDimMashine)): self.AppendPosition(poslist,"FD") if (side=="D"): # Проверяем сторону D if ((x<= eps_d + xmax) and (x+eps_d >= xmin) and ('D' in listDrillDimMashine)): self.AppendPosition(poslist,"AE") if ((x<= eps_d + ymax) and (x+eps_d >= ymin) and (ypanel<= eps_d + xmax) and ('C' in listDrillDimMashine)): self.AppendPosition(poslist,"AC") if ((xpanel-x<= eps_d +ymax) and (xpanel-x+eps_d >=ymin) and ('B' in listDrillDimMashine)): self.AppendPosition(poslist,"AB") if ((xpanel-x<= eps_d +xmax) and (xpanel-x+eps_d >=xmin) and (ypanel<= eps_d +ymax) and ('E' in listDrillDimMashine)): self.AppendPosition(poslist,"AD") if ((xpanel-x<= eps_d +ymax) and (xpanel-x+eps_d >=xmin) and ('D' in listDrillDimMashine)): self.AppendPosition(poslist,"FE") if ((x<= eps_d +ymax) and (x+eps_d >=ymin) and ('C' in listDrillDimMashine)): self.AppendPosition(poslist,"FC") if ((xpanel-x<= eps_d +ymax) and (xpanel-x+eps_d >=ymin) and (ypanel<= eps_d +xmax) and ('B' in listDrillDimMashine)): self.AppendPosition(poslist,"FB") if ((x<= eps_d +xmax) and (x+eps_d >=xmin) and (ypanel<= eps_d +ymax) and ('E' in listDrillDimMashine)): self.AppendPosition(poslist,"FD") if (side=="E"): # Проверяем сторону E if ((x<= eps_d +xmax) and (x+eps_d >=xmin) and (ypanel<= eps_d +ymax) and ('E' in listDrillDimMashine)): self.AppendPosition(poslist,"AE") if ((x<= eps_d +ymax) and (x+eps_d >=ymin) and ('B' in listDrillDimMashine)): self.AppendPosition(poslist,"AC") if ((xpanel-x<= eps_d +ymax) and (xpanel-x+eps_d >=ymin) and (ypanel<= eps_d +xmax) and ('C' in listDrillDimMashine)): self.AppendPosition(poslist,"AB") if ((xpanel-x<= eps_d +xmax) and (xpanel-x+eps_d >=xmin) and ('D' in listDrillDimMashine)): self.AppendPosition(poslist,"AD") if ((xpanel-x<= eps_d +ymax) and (xpanel-x+eps_d >=xmin) and (ypanel<= eps_d +ymax) and ('E' in listDrillDimMashine)): self.AppendPosition(poslist,"FE") if ((x<= eps_d +ymax) and (x+eps_d >=ymin) and (ypanel<= eps_d +xmax) and ('C' in listDrillDimMashine)): self.AppendPosition(poslist,"FC") if ((xpanel-x<= eps_d +ymax) and (xpanel-x+eps_d >=ymin) and ('B' in listDrillDimMashine)): self.AppendPosition(poslist,"FB") if ((x<= eps_d +xmax) and (x+eps_d >=xmin) and ('D' in listDrillDimMashine)): self.AppendPosition(poslist,"FD") posit=tuple(poslist) return posit
def EndPanel(self): '''Функция вызывается в конце обработки каждой панели''' if (self.Selobj == 0): # Если это не выбранная панель, то не фиг ее обрабатывать return b = self.panel.bounding_box Ypanel=b.max.y-b.min.y Xpanel=b.max.x-b.min.x # Если необходимо, проверка на габариты # Utiles.CheckGabs(self,panel,xmin,xmax,ymin,ymax,zmin,zmax) # Запоминаем пропилы и отверстия. Они нам потребуются #slotsave=self.slots drillsave=self.drills self.writeOutputFile('_AE') # Создаем файл вывода и пишем в него накопленную информацию. ## Если есть пропилы вдоль Y по стороне A, поворачиваем панель if (self.isSlotsAY==True): # Поворачиваем относительно правого дальнего угла self.panel.Rotate(vpi/2,machine.Point2d(0,Ypanel)) b = self.panel.bounding_box Xpanel,Ypanel=Ypanel,Xpanel self.panel.Translate(machine.Vector2d(-b.min.x,-b.min.y)) self.panelWidth = self.panel.panel_length self.panelLength = self.panel.panel_width self.workingsides=[] self.workingsides.append(1) # Убираем фрезеровки self.millingTech=[] self.writeOutputFile("_AC") # Возвращаем поворот взад self.panel.Translate(machine.Vector2d(b.min.x,b.min.y)) self.panel.Rotate(-vpi/2,machine.Point2d(0,Xpanel)) Xpanel,Ypanel=Ypanel,Xpanel self.panelWidth = self.panel.panel_width self.panelLength = self.panel.panel_length # Если есть глухие отверстия или пропилы с обратной стороны, надо еще перевернуть панель if (self.isBlindHoleF==True or self.isSlotsFX==True or self.isSlotsFY== True): drlist=[] # Удаляем все отверстия, кроме глухих по F for d in self.drills: if (Utiles.GetDrillPlane(d)=="F"): drlist.append(d) self.drills=drlist # Убираем фрезеровки self.millingTech=[] # Переворачиваем относительно оси X b = self.panel.bounding_box self.panel.Overturn(0) self.panel.Rotate(-vpi,machine.Point2d(0,Xpanel)) self.panel.Translate(machine.Vector2d(Xpanel-b.min.x,0)) if (self.isBlindHoleF==True or self.isSlotsFX==True): self.writeOutputFile("_FD") ## B последнее - пропилы по F вдоль Y if (self.isSlotsFY==True): # Поворачиваем относительно правого дальнего угла self.panel.Rotate(vpi/2,machine.Point2d(0,Ypanel)) Xpanel,Ypanel=Ypanel,Xpanel b = self.panel.bounding_box self.panel.Translate(machine.Vector2d(-b.min.x,-b.min.y)) self.panelWidth = self.panel.panel_length self.panelLength = self.panel.panel_width self.writeOutputFile("_FC") return
def _CheckDrilling(self, operation): '''Проверка операции Сверловка operation - операция Сверловка self - ограничения станка Функция возвращает кортеж положений панели вида <Plane><Side>, где <Plane> - пласть панели, расположенная вверху (А или F) <Side> - сторона панели, расположенная вперед (B, C, D, E) ''' # Проверяем отверстия poslist = [] # Список положений panel = operation.panel # Панель операции bbox = panel.bounding_box ypanel = bbox.max.y - bbox.min.y xpanel = bbox.max.x - bbox.min.x xmin = self.xmin_constr xmax = self.xmax_constr ymin = self.ymin_constr ymax = self.ymax_constr if isinstance(operation, machine.Drilling): position = operation.position matr3d = machine.Matrix3d() matr3d.translate(machine.Vector2d(-bbox.min.x, -bbox.min.y)) position.transform(matr3d) x = position.x y = position.y side = GetDrillPlane(operation) if side == "X": return tuple(poslist) # Проверяем пласти панели if (side == "A"): # Проверяем сторону А if _CheckPositGabs(xmin, xmax, ymin, ymax, x, y): self.AppendPosition(poslist, "AE") if _CheckPositGabs(xmin, xmax, ymin, ymax, ypanel - y, x): self.AppendPosition(poslist, "AC") if _CheckPositGabs(xmin, xmax, ymin, ymax, y, xpanel - x): self.AppendPosition(poslist, "AB") if _CheckPositGabs(xmin, xmax, ymin, ymax, xpanel - x, ypanel - y): self.AppendPosition(poslist, "AD") if ((operation.depth >= panel.thickness and side == "A") or side == "F"): # Если отверстие сквозное или сторона F if _CheckPositGabs(xmin, xmax, ymin, ymax, xpanel - x, y): self.AppendPosition(poslist, "FE") if _CheckPositGabs(xmin, xmax, ymin, ymax, y, x): self.AppendPosition(poslist, "FC") if _CheckPositGabs(xmin, xmax, ymin, ymax, ypanel - y, xpanel - x): self.AppendPosition(poslist, "FB") if _CheckPositGabs(xmin, xmax, ymin, ymax, x, ypanel - y): self.AppendPosition(poslist, "FD") if (side == "B"): # Проверяем сторону B if (y < ymax and y > ymin): self.AppendPosition(poslist, "AE") if (ypanel - y < xmax and ypanel - y > xmin): self.AppendPosition(poslist, "AC") if (y < xmax and y > xmin and xpanel < ymax): self.AppendPosition(poslist, "AB") if (ypanel - y < ymax and ypanel - y > ymin and xpanel < xmax): self.AppendPosition(poslist, "AD") if (y < ymax and y > ymin and xpanel < xmax): self.AppendPosition(poslist, "FE") if (y < xmax and y > xmin): self.AppendPosition(poslist, "FC") if (ypanel - y < xmax and ypanel - y > xmin and xpanel < ymax): self.AppendPosition(poslist, "FB") if (ypanel - y < ymax and ypanel - y > ymin): self.AppendPosition(poslist, "FD") if (side == "C"): # Проверяем сторону C if (y < ymax and y > ymin and xpanel < xmax): self.AppendPosition(poslist, "AE") if (ypanel - y < xmax and ypanel - y > xmin and xpanel < ymax): self.AppendPosition(poslist, "AC") if (y < xmax and y > xmin): self.AppendPosition(poslist, "AB") if (ypanel - y < ymax and ypanel - y > ymin): self.AppendPosition(poslist, "AD") if (y < ymax and y > ymin): self.AppendPosition(poslist, "FE") if (y < xmax and y > xmin and xpanel < ymax): self.AppendPosition(poslist, "FC") if (ypanel - y < xmax and ypanel - y > xmin): self.AppendPosition(poslist, "FB") if (ypanel - y < ymax and ypanel - y > ymin and xpanel < xmax): self.AppendPosition(poslist, "FD") if (side == "D"): # Проверяем сторону D if (x < xmax and x > xmin): self.AppendPosition(poslist, "AE") if (x < ymax and x > ymin and ypanel < xmax): self.AppendPosition(poslist, "AC") if (xpanel - x < ymax and xpanel - x > ymin): self.AppendPosition(poslist, "AB") if (xpanel - x < xmax and xpanel - x > xmin and ypanel < ymax): self.AppendPosition(poslist, "AD") if (xpanel - x < ymax and xpanel - x > xmin): self.AppendPosition(poslist, "FE") if (x < ymax and x > ymin): self.AppendPosition(poslist, "FC") if (xpanel - x < ymax and xpanel - x > ymin and ypanel < xmax): self.AppendPosition(poslist, "FB") if (x < xmax and x > xmin and ypanel < ymax): self.AppendPosition(poslist, "FD") if (side == "E"): # Проверяем сторону E if (x < xmax and x > xmin and ypanel < ymax): self.AppendPosition(poslist, "AE") if (x < ymax and x > ymin): self.AppendPosition(poslist, "AC") if (xpanel - x < ymax and xpanel - x > ymin and ypanel < xmax): self.AppendPosition(poslist, "AB") if (xpanel - x < xmax and xpanel - x > xmin): self.AppendPosition(poslist, "AD") if (xpanel - x < ymax and xpanel - x > xmin and ypanel < ymax): self.AppendPosition(poslist, "FE") if (x < ymax and x > ymin and ypanel < xmax): self.AppendPosition(poslist, "FC") if (xpanel - x < ymax and xpanel - x > ymin): self.AppendPosition(poslist, "FB") if (x < xmax and x > xmin): self.AppendPosition(poslist, "FD") return tuple(poslist)