|
|
| Descrizione |
|---|
| Invia un oggetto selezionato a PCBWay per la produzione tramite fresatura CNC, taglio laser o stampa 3D. Versione macro: 1.0 Ultima modifica: 2022-07-22 Versione FreeCAD: All Download: ToolBar Icon Autore: Yorik van Havre |
| Autore |
| Yorik van Havre |
| Download |
| ToolBar Icon |
| Link |
| Raccolta di macro Come installare le macro Personalizzare la toolbar |
| Versione macro |
| 1.0 |
| Data ultima modifica |
| 2022-07-22 |
| Versioni di FreeCAD |
| All |
| Scorciatoia |
| Nessuna |
| Vedere anche |
| Nessuno |
Descrizione
Questa macro invia l'oggetto attualmente selezionato (mesh, forma o corpo) al sito web PCBWay [1] per ottenere un preventivo immediato per la produzione tramite fresatura CNC, taglio laser o stampa 3D. Dopo l'invio dell'oggetto, verrà aperta una pagina sul sito web PCBWay per consentire all'utente di modificare dettagli e opzioni.
Nota: gli oggetti basati su mesh possono essere realizzati solo tramite stampa 3D. Per la fresatura CNC o il taglio laser, è necessario utilizzare oggetti basati su forme.
Temporary code for external macro link. Do not use this code. This code is used exclusively by Addon Manager. Link for optional manual installation: Macro
# This code is copied instead of the original macro code
# to guide the user to the online download page.
# Use it if the code of the macro is larger than 64 KB and cannot be included in the wiki
# or if the RAW code URL is somewhere else in the wiki.
from PySide import QtGui, QtCore
diag = QtGui.QMessageBox(QtGui.QMessageBox.Information,
"Information",
"This macro must be downloaded from this link\n"
"\n"
"https://raw.githubusercontent.com/FreeCAD/FreeCAD-macros/master/Utility/pcbway.FCMacro" + "\n"
"\n"
"Quit this window to access the download page")
diag.setWindowFlags(QtCore.Qt.WindowStaysOnTopHint)
diag.setWindowModality(QtCore.Qt.ApplicationModal)
diag.exec_()
import webbrowser
webbrowser.open("https://raw.githubusercontent.com/FreeCAD/FreeCAD-macros/master/Utility/pcbway.FCMacro")
Utilizzo
- Aprire o creare un documento FreeCAD contenente un oggetto che desideri realizzare con PCBWay.
- Selezionare l'oggetto che si desidera realizzare. Se non è selezionato alcun oggetto ma è visibile un solo oggetto sullo schermo, tale oggetto verrà inviato.
- Aprire Gestore Macro nel menu Macro → Macro....
- Selezionare la macro PCBWay dall'elenco.
- Fare clic su Esegui.
- Le volte successive, la macro PCBWay sarà disponibile nel menu Macro → Macro recenti.
- L'oggetto verrà compresso nel formato STEP per le forme o nel formato OBJ per le mesh e inviato a PCBWay. Si aprirà quindi una finestra del browser in cui si potranno inserire ulteriori dettagli ed effettuare un ordine per il prodotto.
Codice
L'ultima versione della macro è disponibile su https://github.com/FreeCAD/FreeCAD-macros/blob/master/Utility/pcbway.FCMacro
Macro_PCBWay.FCMacro
#***************************************************************************
#* *
#* Copyright (c) 2022 Yorik van Havre <yorik@uncreated.net> *
#* *
#* This program is free software; you can redistribute it and/or modify *
#* it under the terms of the GNU Lesser General Public License (LGPL) *
#* as published by the Free Software Foundation; either version 2 of *
#* the License, or (at your option) any later version. *
#* for detail see the LICENCE text file. *
#* *
#* This program is distributed in the hope that it will be useful, *
#* but WITHOUT ANY WARRANTY; without even the implied warranty of *
#* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the *
#* GNU Library General Public License for more details. *
#* *
#* You should have received a copy of the GNU Library General Public *
#* License along with this program; if not, write to the Free Software *
#* Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 *
#* USA *
#* *
#***************************************************************************
"""
PCBWay Macro for FreeCAD
https://pcbway.com
This macro sends the currently selected object to the PCBWay website
to get an instant quote for manufacturing. After the object is sent,
a page will be opened on the PCBWay website to allow the user to adjust
details and options.
"""
# code inspired / borrowed from:
# KiCAD PcbWay plugin: https://github.com/pcbway/PCBWay-Plug-in-for-Kicad/blob/main/plugins/thread.py
# urllib-based upload: http://pymotw.com/2/urllib2/#uploading-files
# mime stuff: https://stackoverflow.com/questions/27099290/where-is-mimetools-choose-boundary-function-in-python3#27174474
# version history:
# version 1.0 - 2022.07.22
__title__ = "Macro_PCBWay"
__author__ = "Yorik van Havre"
__wiki__ = "https://www.freecad.org/wiki/Macro_PCBWay"
__url__ = "https://www.pcbway.com"
__version__ = "1.0"
__date__ = "22/07/2022"
import tempfile
import os
import FreeCAD
import FreeCADGui
import json
import webbrowser
import urllib.request
import urllib.parse
import email.generator
import itertools
pcb_url = "https://www.pcbway.com/common/freecadupfile"
def msg(message):
"""prints a message where appropriate"""
FreeCAD.Console.PrintError(message+"\n")
if FreeCAD.GuiUp:
from PySide import QtGui
reply = QtGui.QMessageBox.critical(None,"PCBWay export",message)
class MultiPartData(object):
"""Gathers data and files to be sent via HTTP POST"""
def __init__(self):
self.form_fields = []
self.files = []
self.boundary = email.generator._make_boundary()
self.add_field("Unit","Millimeter") #FreeCAD's boundboxes are always in mm
return
def get_content_type(self):
return 'multipart/form-data; boundary=%s' % self.boundary
def add_field(self, name, value):
"""Add a simple field to the form data."""
self.form_fields.append((name, str(value)))
return
def add_file(self, fieldname, filename, fileHandle, mime):
"""Add a file to be uploaded."""
body = fileHandle.read()
self.files.append((fieldname, filename, mime, body))
return
def get_bytes(self):
"""Return a string representing the form data, including attached files."""
parts = []
part_boundary = '--' + self.boundary
parts.extend([part_boundary,'Content-Disposition: form-data; name="%s"' % name,'',value] for name, value in self.form_fields)
parts.extend([part_boundary,'Content-Disposition: file; name="%s"; filename="%s"' % (field_name, filename),
'Content-Type: %s' % content_type,'',body] for field_name, filename, content_type, body in self.files)
flattened = list(itertools.chain(*parts))
flattened.append('--' + self.boundary + '--')
flattened.append('')
return bytes('\r\n'.join(flattened),'utf8')
def main():
# validity tests
mesh = None
shape = None
if not FreeCAD.GuiUp:
return
if not FreeCAD.ActiveDocument:
msg("There is no opened document. Please open or create a document containing objects before running this macro.")
return
# get the selected object, or the only visible body or object if nothing is selected
selection = FreeCADGui.Selection.getSelection()
if not selection:
visibles = [obj for obj in FreeCAD.ActiveDocument.Objects if obj.ViewObject.Visibility]
if len(visibles) == 1:
obj = visibles[0]
if hasattr(obj,"Shape"):
shape = obj.Shape
elif hasattr(obj,"Mesh"):
mesh = obj.Mesh
elif len(visibles) > 1:
bodies = [obj for obj in visibles if obj.isDerivedFrom("PartDesign::Body")]
if len(bodies) == 1:
shape = bodies[0].Shape
else:
msg("No object is selected. Please select one object or body before running this macro.")
return
elif len(selection) > 1:
msg("More than one object is selected. Please select only one object or body before running this macro.")
return
else:
obj = selection[0]
if hasattr(obj,"Shape"):
shape = obj.Shape
if (not shape) or (not hasattr(shape,"isNull")) or shape.isNull():
msg("The selected object has no shape. Please select an object with a shape before running this macro.")
return
elif hasattr(obj,"Mesh"):
mesh = obj.Mesh
if (not shape) and (not mesh):
msg("Unable to find a suitable shape in the selection or in the visible objects. Please select an object before running this macro.")
return
# offer to add the macro as a button on first run
# not working yet!
# prefs = FreeCAD.ParamGet("User parameter:Plugins/PCBWay")
# if prefs.GetBool("FirstTime",True):
# prefs.SetBool("FirstTime",False)
# from PySide import QtGui
# reply = QtGui.QMessageBox.question(None, "Install macro?",
# "This is the first time you are launching the PCBWay macro. Do you wish to add a toolbar button for it?",
# QtGui.QMessageBox.Yes
Questa pagina è recuperata da https://wiki.freecad.org/Macro_PCBWay