Важно осознать, что любое действие, любое нажатие кнопкой мыши во FreeCAD лишь выполняет команду Python.
Это можно увидеть открыв консоль Python (Вид - Панели - Консоль Python).
Макросы (сценарии на языке Python) позволяют быстро решать рутинные задачи.
Последние макросы можно запустить при помощи горячих клавиш.
Создание макросов
-
- Помогаю слегка
- Сообщения: 2552
- Зарегистрирован: 18 янв 2020, 11:49
- Откуда: Ростов-на-Дону
Создание макросов
Не бойся поломать. Бойся не починить ))
-
- Помогаю слегка
- Сообщения: 2552
- Зарегистрирован: 18 янв 2020, 11:49
- Откуда: Ростов-на-Дону
Re: Макросы
Сброс относительного положения выделенных объектов
Код: Выделить всё
elements = Gui.Selection.getSelection() # Получение списка выделенных элементов
for element in elements: # Обработка каждого элемента в списке
element.Placement = App.Placement(App.Vector(0,0,0),App.Rotation(App.Vector(0,0,1),0)) # Изменение положения элемента
Создание снимка области отображения модели
Код: Выделить всё
# Размер изображения
resolution_w = 1920 # Ширина, пикселей
resolution_h = 1080 # Высота, пикселей
# Фон
background = "Current" # Текущий
#background = "White" # Белый
#background = "Transparent" # Прозрачный
import datetime
import os
doc_filename = FreeCAD.activeDocument().FileName # Полный путь к документу с моделью
if doc_filename: # Если файл сохранён,
path = os.path.splitext(doc_filename)[0] # Полный путь без расширения
else: # иначе
from pathlib import Path
path = str(Path.home()) + "/" # Путь к домашнему каталогу
now = datetime.datetime.now() # Текущее время
sufix = now.strftime("%Y%m%d_%H%M%S")
image_path = path + "_screenshot_" + sufix + ".png" # Путь сохранения изображения
# Создание снимка
Gui.activeDocument().activeView().saveImage(image_path,resolution_w,resolution_h,background)
# Вывод сообщения в окно отчёта
if os.path.exists(image_path):
FreeCAD.Console.PrintMessage('Снимок сохранён в файл:\n' + image_path + '\n')
Экспорт в stl и передача выделенных моделей в слайсер
Укажите параметры в начале сценария.
Код: Выделить всё
# -*- coding: utf-8 -*-
# ---------------- Экспорт выделенных моделей в STL --------------------
angular_deflection = 0.1 # Угловое отклонение, мм
linear_deflection=0.05 # Линейное отклонение, градусов
open_slicer = True # Открывать модели в слайсере? True/False
slicer_path = '/home/demonlibra/app/PrusaSlicer/prusa-slicer' # Путь к слайсеру
# ----------------------------------------------------------------------
import os
import subprocess
import Mesh
import MeshPart
import FreeCAD
output_format = 'stl'
def get_filename(doc_filename):
if doc_filename:
dirname = os.path.dirname(doc_filename)
filename = os.path.basename(doc_filename).partition('.')[0]
file_path = os.path.join(dirname, filename)
else:
from pathlib import Path
file_path = str(Path.home()) + "/export_mesh" # Путь к домашнему каталогу
return file_path
def main():
doc = FreeCAD.activeDocument()
if not doc:
raise RuntimeError('Отсутствует активный документ')
objects_to_export = Gui.Selection.getSelection()
mesh_path_export = get_filename(doc.FileName)
try:
# Создание временного документа
tmp_doc = FreeCAD.newDocument('meshes')
meshes = []
for element in objects_to_export:
if element.TypeId == 'Mesh::Feature':
meshes.append(element)
else:
mesh = tmp_doc.addObject('Mesh::Feature', '{}_{}'.format(doc.Label, element.Label))
mesh.Mesh = MeshPart.meshFromShape(element.Shape, LinearDeflection=linear_deflection, AngularDeflection=angular_deflection, Relative=False)
meshes.append(mesh)
if meshes:
if len(meshes) > 1:
mesh_path = mesh_path_export + '.' + output_format
else:
mesh_path = mesh_path_export + ' - ' + element.Label + '.' + output_format
Mesh.export(meshes, mesh_path)
else:
raise RuntimeError('Не выбраны элементы для экспорта')
finally:
FreeCAD.closeDocument('meshes')
FreeCAD.Console.PrintMessage('Экспортированы модели в файл:\n {}\n'.format(mesh_path))
if open_slicer:
subprocess.Popen((slicer_path, mesh_path))
FreeCAD.Console.PrintMessage('Модели переданы в слайсер')
try:
main()
except Exception as e:
FreeCAD.Console.PrintMessage('Ошибка экспортирования моделей в stl:\n {}\n'.format(e))
Переключение видимости окон Консоли и Отчёта
Код: Выделить всё
from PySide import QtGui
mw = FreeCADGui.getMainWindow()
dws = mw.findChildren(QtGui.QDockWidget)
# objectName may be :
# "Report view"
# "Tree view"
# "Property view"
# "Selection view"
# "Combo View"
# "Python console"
# "draftToolbar"
for i in dws:
if i.objectName() == "Report view":
dw = i
break
va = dw.toggleViewAction()
if 'checked=true' in str(va):
va.setChecked(False)
dw.setVisible(False)
flag = False
else:
va.setChecked(True)
dw.setVisible(True)
flag = True
for i in dws:
if i.objectName() == "Python console":
dw = i
break
va = dw.toggleViewAction()
if flag:
va.setChecked(True)
dw.setVisible(True)
else:
va.setChecked(False)
dw.setVisible(False)
Не бойся поломать. Бойся не починить ))