Создание макросов

Аватара пользователя
demonlibra
Помогаю слегка
Сообщения: 2552
Зарегистрирован: 18 янв 2020, 11:49
Откуда: Ростов-на-Дону

Создание макросов

Сообщение demonlibra »

Важно осознать, что любое действие, любое нажатие кнопкой мыши во FreeCAD лишь выполняет команду Python.
Это можно увидеть открыв консоль Python (Вид - Панели - Консоль Python).

Макросы (сценарии на языке Python) позволяют быстро решать рутинные задачи.

Последние макросы можно запустить при помощи горячих клавиш.
Изображение
Не бойся поломать. Бойся не починить ))
Изображение
Аватара пользователя
demonlibra
Помогаю слегка
Сообщения: 2552
Зарегистрирован: 18 янв 2020, 11:49
Откуда: Ростов-на-Дону

Re: Макросы

Сообщение demonlibra »

Сброс относительного положения выделенных объектов

Код: Выделить всё

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)
Не бойся поломать. Бойся не починить ))
Изображение

Вернуться в «FreeCAD»