Hi
I need some support with a script, which hopefully should generate a lasercutable shell of a low poly object.
The start is done with some help of ChatGPT. Sorry I'm not a coder. 😉
The script generates all faces. I'm stuck a the point, where I want to alter these faces: As a first step the outline of the generated faces should get a bit smaller. At the moment I'm fine with a fixed value like the thickness of the shell (2mm). Later this should be replace with a value, which respects the angle between two faces (see the images below)
Can somebody provide hints how I can select and move the faces a bit inwards?
Very helpful would be, if I somehow can see the list of commands while I do the editing of the model by hand. Is there something like this available?
Sample Body: https://a360.co/41N9DbY
Expencted Result: https://a360.co/4iY5M1K
import adsk.core, adsk.fusion, adsk.cam, traceback
import math
def duplicate_and_extrude_faces():
try:
# Die Fusion-App-Instanz abrufen
app = adsk.core.Application.get()
ui = app.userInterface
# Die aktive Design-Umgebung abrufen
design = app.activeProduct
if not design:
ui.messageBox('Kein aktives Design gefunden.')
return
# Benutzer auffordern, einen Körper auszuwählen
ui.messageBox('Bitte einen Körper auswählen, den Sie bearbeiten möchten.')
selection = ui.selectEntity('Körper auswählen', 'Bodies')
if not selection:
ui.messageBox('Es wurde kein Körper ausgewählt.')
return
body = selection.entity
if not isinstance(body, adsk.fusion.BRepBody):
ui.messageBox('Das ausgewählte Objekt ist kein gültiger Körper.')
return
# Benutzer nach dem Offset-Wert fragen
input_box = ui.inputBox('Bitte den Offset-Wert eingeben (negativ für innen):', 'Offset-Wert', '-1.0')
if input_box is None: # Wenn der Benutzer "Abbrechen" drückt
return
# Falls die Eingabe eine Liste ist, den ersten Eintrag verwenden
if isinstance(input_box, list):
input_box = input_box[0]
try:
offset_value = float(input_box)
except ValueError:
ui.messageBox('Der eingegebene Wert ist keine gültige Zahl.')
return
if offset_value >= 0:
ui.messageBox('Bitte geben Sie einen negativen Wert ein, um nach innen zu extrudieren.')
return
# Korrektur für die Einheiten (wenn der Fehler mit Faktor 10 zu tun hat)
offset_value = offset_value / 10 # Hier teilen wir durch 10, um den Faktor zu korrigieren
# Körper duplizieren
body_collection = adsk.core.ObjectCollection.create()
body_collection.add(body)
copy_feature = body.parentComponent.features.copyPasteBodies.add(body_collection)
copied_body = copy_feature.bodies[0]
# Ursprungskörper umbenennen und ausblenden
body.name = 'Original'
body.isVisible = False # Der Körper wird ausgeblendet
# Kopie des Körpers löschen
copied_body.deleteMe()
# Alle Flächen des Originalkörpers extrudieren
face_collection = adsk.core.ObjectCollection.create()
for face in body.faces:
face_collection.add(face)
# Flächen extrudieren und benennen
extrude_features = body.parentComponent.features.extrudeFeatures
shell_counter = 1
original_face = None # Variable zum Speichern der ursprünglichen Fläche
for face in face_collection:
# Extrusionseingabe erstellen
extrude_input = extrude_features.createInput(
face, adsk.fusion.FeatureOperations.NewBodyFeatureOperation
)
extrude_input.setDistanceExtent(False, adsk.core.ValueInput.createByReal(offset_value))
extrude_feature = extrude_features.add(extrude_input)
# Den extrudierten Körper benennen
extrude_feature.bodies[0].name = f'Shell_{shell_counter}'
# Wenn es Shell_1 ist, speichern wir die ursprüngliche Fläche
if shell_counter == 1:
original_face = face
shell_counter += 1
# Ursprüngliche Fläche selektieren
if original_face:
ui.activeSelections.clear() # Auswahl leeren
ui.activeSelections.add(original_face) # Ursprüngliche Fläche zur Auswahl hinzufügen
ui.messageBox(f'Die ursprüngliche Fläche wurde erfolgreich selektiert.')
else:
ui.messageBox('Konnte die ursprüngliche Fläche nicht finden.')
except Exception as e:
if ui:
ui.messageBox(f'Fehler:\n{traceback.format_exc()}')
# Funktion aufrufen
duplicate_and_extrude_faces()
Can't find what you're looking for? Ask the community or share your knowledge.