2023-05-23 15:48:20 +03:00
|
|
|
|
from helper.is_solid import is_object_solid
|
|
|
|
|
import FreeCAD as App
|
|
|
|
|
import Spreadsheet
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
def createSpreadsheet():
|
|
|
|
|
|
|
|
|
|
if App.ActiveDocument.getObject("BoM_List") == None:
|
|
|
|
|
|
|
|
|
|
sheet = App.activeDocument().addObject('Spreadsheet::Sheet', 'BoM_List')
|
|
|
|
|
sheet.set('A1', 'п.п.')
|
|
|
|
|
sheet.set('B1', 'Наименование детали')
|
|
|
|
|
sheet.set('C1', 'Количество')
|
|
|
|
|
else:
|
|
|
|
|
|
|
|
|
|
sheet = App.ActiveDocument.getObject("BoM_List")
|
|
|
|
|
App.ActiveDocument.BoM_List.clear('A1:ZZ16384')
|
|
|
|
|
sheet.set('A1', 'п.п.')
|
|
|
|
|
sheet.set('B1', 'Наименование детали')
|
|
|
|
|
sheet.set('C1', 'Количество')
|
|
|
|
|
|
|
|
|
|
return (sheet)
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
class SolidBodiesParcer:
|
|
|
|
|
_asmThere = []
|
|
|
|
|
|
|
|
|
|
def __init__(self) -> None:
|
|
|
|
|
if (self._asmThere.__len__() == 0):
|
|
|
|
|
|
|
|
|
|
self.initParse()
|
|
|
|
|
pass
|
|
|
|
|
|
|
|
|
|
def initParse(self):
|
|
|
|
|
for el in App.ActiveDocument.RootObjects:
|
|
|
|
|
if (is_object_solid(el) and hasattr(el, 'Group')):
|
|
|
|
|
self.getSubPartsLink(el.Group, el.Label)
|
|
|
|
|
|
|
|
|
|
def getSubPartsLink(self, group, label):
|
|
|
|
|
groupLink = {label: []}
|
|
|
|
|
for el in group:
|
|
|
|
|
if (is_object_solid(el)):
|
|
|
|
|
groupLink[label].append(
|
|
|
|
|
{'label': el.Label, 'isGroup': hasattr(el, 'Group'), 'solid': el})
|
|
|
|
|
|
|
|
|
|
for el in groupLink[label]:
|
|
|
|
|
if ('isGroup' in el):
|
|
|
|
|
if (el['isGroup'] == False):
|
|
|
|
|
self._asmThere.append(el['solid'].Label)
|
|
|
|
|
if (el['isGroup']):
|
|
|
|
|
self.getSubPartsLink(el['solid'].Group, el['label']),
|
|
|
|
|
|
|
|
|
|
return groupLink
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
def uniquePartsSort(labelParts):
|
|
|
|
|
|
|
|
|
|
uniquePartsLabels = {}
|
|
|
|
|
|
|
|
|
|
for el in labelParts:
|
|
|
|
|
for k in labelParts:
|
|
|
|
|
if (App.ActiveDocument.getObjectsByLabel(str(el))[0].Shape.isPartner(App.ActiveDocument.getObjectsByLabel(str(k))[0].Shape)):
|
|
|
|
|
|
|
|
|
|
if uniquePartsLabels.get(el) == None:
|
|
|
|
|
uniquePartsLabels[el] = k
|
|
|
|
|
|
|
|
|
|
sortedParts = {}
|
|
|
|
|
|
|
|
|
|
for k, v in uniquePartsLabels.items():
|
|
|
|
|
|
|
|
|
|
if sortedParts.get(v) == None:
|
|
|
|
|
sortedParts[v] = [k]
|
|
|
|
|
else:
|
|
|
|
|
sortedParts[v].append(k)
|
|
|
|
|
|
|
|
|
|
return sortedParts
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
def countForUniques(sortedParts):
|
|
|
|
|
countedParts = {}
|
|
|
|
|
for k in sortedParts:
|
|
|
|
|
countedParts[k] = len(sortedParts[k])
|
|
|
|
|
return countedParts
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
def fillInBoMList(sheet, countedParts):
|
|
|
|
|
|
|
|
|
|
a = 1
|
|
|
|
|
|
|
|
|
|
for label, count in countedParts.items():
|
|
|
|
|
a += 1
|
|
|
|
|
b = label
|
|
|
|
|
c = count
|
|
|
|
|
sheet.set('A' + str(a), str(a-1))
|
|
|
|
|
sheet.set('B' + str(a), str(b))
|
|
|
|
|
sheet.set('C' + str(a), str(c))
|
|
|
|
|
|
|
|
|
|
total_count = sum(countedParts.values())
|
|
|
|
|
sheet.set('B'+str(a+1), 'Итого')
|
|
|
|
|
|
|
|
|
|
sheet.set('C' + str(a+1), str(total_count))
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
def run_BoM_list():
|
|
|
|
|
createSpreadsheet()
|
|
|
|
|
sheet = App.ActiveDocument.getObject("BoM_List")
|
|
|
|
|
labelParts = SolidBodiesParcer()._asmThere
|
|
|
|
|
sortedParts = uniquePartsSort(labelParts)
|
|
|
|
|
countedParts = countForUniques(sortedParts)
|
|
|
|
|
fillInBoMList(sheet, countedParts)
|
2023-06-29 09:09:25 +03:00
|
|
|
|
<<<<<<< HEAD
|
2023-06-27 16:51:02 +03:00
|
|
|
|
|
|
|
|
|
|
|
|
|
|
def printETACounter(partLabel):
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
import os
|
|
|
|
|
import requests
|
|
|
|
|
import time
|
|
|
|
|
|
|
|
|
|
import FreeCAD
|
|
|
|
|
from FreeCAD import Base
|
|
|
|
|
|
|
|
|
|
def export_to_stl(doc, filename):
|
|
|
|
|
mesh = doc.getObjectsByType("Mesh")[0]
|
|
|
|
|
mesh.exportStl(filename)
|
|
|
|
|
|
|
|
|
|
def upload_to_octoprint(file_path, api_key, octoprint_url):
|
|
|
|
|
headers = {
|
|
|
|
|
"X-Api-Key": api_key
|
|
|
|
|
}
|
|
|
|
|
files = {
|
|
|
|
|
"file": open(file_path, "rb")
|
|
|
|
|
}
|
|
|
|
|
response = requests.post(octoprint_url + "/api/files/local", headers=headers, files=files)
|
|
|
|
|
if response.status_code == 201:
|
|
|
|
|
print("Файл успешно загружен в OctoPrint.")
|
|
|
|
|
return response.json()["name"]
|
|
|
|
|
else:
|
|
|
|
|
print("Ошибка при загрузке файла в OctoPrint:", response.text)
|
|
|
|
|
return None
|
|
|
|
|
|
|
|
|
|
def get_print_duration(file_name, api_key, octoprint_url):
|
|
|
|
|
headers = {
|
|
|
|
|
"X-Api-Key": api_key
|
|
|
|
|
}
|
|
|
|
|
response = requests.get(octoprint_url + "/api/files/local/" + file_name, headers=headers)
|
|
|
|
|
if response.status_code == 200:
|
|
|
|
|
return response.json()["gcodeAnalysis"]["estimatedPrintTime"]
|
|
|
|
|
else:
|
|
|
|
|
print("Ошибка при получении информации о файле из OctoPrint:", response.text)
|
|
|
|
|
return None
|
|
|
|
|
|
|
|
|
|
# Путь к документу FreeCAD
|
|
|
|
|
doc_path = "/path/to/your/file.FCStd"
|
|
|
|
|
|
|
|
|
|
# Путь для сохранения STL-файла
|
|
|
|
|
stl_path = "/path/to/your/output.stl"
|
|
|
|
|
|
|
|
|
|
# Настройки OctoPrint
|
|
|
|
|
octoprint_api_key = "your_octoprint_api_key"
|
|
|
|
|
octoprint_url = "http://localhost:5000"
|
|
|
|
|
|
|
|
|
|
# Открываем документ FreeCAD
|
|
|
|
|
doc = FreeCAD.open(doc_path)
|
|
|
|
|
|
|
|
|
|
# Экспортируем модель в STL-файл
|
|
|
|
|
export_to_stl(doc, stl_path)
|
|
|
|
|
print("STL-файл успешно создан.")
|
|
|
|
|
|
|
|
|
|
# Загружаем STL-файл в OctoPrint
|
|
|
|
|
uploaded_file_name = upload_to_octoprint(stl_path, octoprint_api_key, octoprint_url)
|
|
|
|
|
if uploaded_file_name is not None:
|
|
|
|
|
# Получаем информацию о длительности печати
|
|
|
|
|
print_duration = get_print_duration(uploaded_file_name, octoprint_api_key, octoprint_url)
|
|
|
|
|
if print_duration is not None:
|
|
|
|
|
print("Оценочная длительность печати: {} секунд.".format(print_duration))
|
|
|
|
|
else:
|
|
|
|
|
print("Не удалось получить информацию о длительности печати.")
|
|
|
|
|
else:
|
|
|
|
|
print("Загрузка файла в OctoPrint не удалась.")
|
|
|
|
|
|
|
|
|
|
# Закрываем документ FreeCAD
|
|
|
|
|
FreeCAD.closeDocument(doc)
|
|
|
|
|
|
|
|
|
|
|
2023-06-29 09:09:25 +03:00
|
|
|
|
=======
|
|
|
|
|
>>>>>>> 839ce36c70e0a48d82c32c5b6fe17c5634c8ee07
|