FreeCAD-macros

Форк
0
/
Export2Slicer.FCMacro 
114 строк · 3.7 Кб
1
# -*- coding: utf-8 -*-
2
# Opens current visible objects in Slic3r. One can use different slicing software
3

4
__Title__ = '3D Print / Slice'
5
__Author__ = 'Damian Łoziński'
6
__Version__ = '0.4.1'
7
__Date__ = '2024-08-28'
8
__Comment__ = 'Export selected objects to amf/stl files and open them in slicing program'
9
__Web__ = 'https://github.com/dlozinski/FreeCAD-macros/blob/doc/ImportExport/ExportToSlicer.md'
10
__Wiki__ = ''
11
__Icon__ = 'Export2Slicer.png'
12
__Help__ = 'You may need to change slicer path. To do so open Tools > Edit parameters > BaseApp/Preferences/Macros/Export2Slicer'
13
__Status__ = 'Stable'
14
__Requires__ = 'freecad 0.17+'
15
__Communication__ = 'lozinski dot d at gmail dot com'
16
__Files__ = 'Export2Slicer.png'
17

18
import os
19
import re
20
from subprocess import Popen
21
import shlex
22

23
import FreeCAD as app
24
import FreeCADGui as gui
25
import Mesh
26
import MeshPart
27

28

29
MACRO_PARAMS = app.ParamGet('User parameter:BaseApp/Preferences/Macros/Export2Slicer')
30
DEFAULT_SLICER_CMD = '"/Applications/Original Prusa Drivers/PrusaSlicer.app/Contents/MacOS/PrusaSlicer" --single-instance "{file}"'
31
DEFAULT_OUTPUT_FORMAT = 'amf'
32
DEFAULT_ANGULAR_DEFLECTION = 0.07
33

34

35
def get_string_param(name, default):
36
    value = MACRO_PARAMS.GetString(name)
37
    if not value:
38
        MACRO_PARAMS.SetString(name, default)
39
        value = default
40
    return value
41

42

43
def get_float_param(name, default):
44
    value = MACRO_PARAMS.GetFloat(name)
45
    if not value:
46
        MACRO_PARAMS.SetFloat(name, default)
47
        value = default
48
    return value
49

50

51
slicer_cmd = get_string_param('SlicerCommand', DEFAULT_SLICER_CMD)
52
output_format = get_string_param('OutputFormat', DEFAULT_OUTPUT_FORMAT)
53
angular_deflection = get_float_param('AngularDeflection', DEFAULT_ANGULAR_DEFLECTION)
54

55

56
def escape(text):
57
    return re.sub(r'\W', '_', text)
58

59

60
def get_mesh_filename(doc_filename, mesh_names):
61
    """Returns valid filename for temporary mesh file."""
62
    if doc_filename:
63
        dirname = os.path.dirname(doc_filename)
64
        filename = (
65
            os.path.basename(doc_filename).partition('.')[0]
66
            + '-'
67
            + escape('_'.join(mesh_names))
68
            + '.'
69
            + output_format)
70
        file_path = os.path.join(dirname, filename)
71
    else:
72
        file_path = 'meshes-export.' + output_format
73
    return file_path
74

75

76
def main():
77
    doc = app.activeDocument()
78
    if not doc:
79
        raise RuntimeError('Export2Slicer: No active document')
80

81
    selection = gui.Selection.getSelectionEx()
82
    objects_to_export = [x.Object for x in selection] or [doc.ActiveObject]
83
    try:
84
        # Create temporary doc to store meshes so that we don't affect current doc history
85
        tmp_doc = app.newDocument('meshes_to_export', temp=True)
86
        meshes = []
87
        mesh_names = []
88
        for o in objects_to_export:
89
            if o.TypeId == 'Mesh::Feature':
90
                meshes.append(o)
91
            else:
92
                mesh = tmp_doc.addObject('Mesh::Feature', f'{doc.Label}_{o.Label}')
93
                mesh.Mesh = MeshPart.meshFromShape(o.Shape, LinearDeflection=0.1, AngularDeflection=angular_deflection, Relative=False)
94
                meshes.append(mesh)
95
                mesh_names.append(o.Label)
96
        if meshes:
97
            mesh_path = get_mesh_filename(doc.FileName, mesh_names)
98
            Mesh.export(meshes, mesh_path)
99
        else:
100
            raise RuntimeError('Export2Slicer: No objects to export')
101
    finally:
102
        app.closeDocument('meshes_to_export')
103
        for x in selection:
104
            gui.Selection.addSelection(doc.Name, x.ObjectName)
105

106
    # Launch Slicer with meshes
107
    Popen(shlex.split(slicer_cmd.format(file=mesh_path)))
108
    app.Console.PrintMessage(f'Export2Slicer: Objects exported into: {mesh_path}\n')
109

110

111
try:
112
    main()
113
except Exception as e:
114
    app.Console.PrintError('Export2Slicer: ERROR: {}\n'.format(e))
115

Использование cookies

Мы используем файлы cookie в соответствии с Политикой конфиденциальности и Политикой использования cookies.

Нажимая кнопку «Принимаю», Вы даете АО «СберТех» согласие на обработку Ваших персональных данных в целях совершенствования нашего веб-сайта и Сервиса GitVerse, а также повышения удобства их использования.

Запретить использование cookies Вы можете самостоятельно в настройках Вашего браузера.