un aiutino sullo sketch

Forum per le domande e le discussioni in Italiano
Forum rules
regole del forum e le informazioni utili

Importante: PRIMA di chiedere aiuto leggete qui!
Post Reply
tiberium
Posts: 2
Joined: Wed Dec 08, 2021 9:04 am

un aiutino sullo sketch

Post by tiberium »

Salve freecaddiani,
Avrei bisogno di un aiutino per capire come posso scalare un disegno sketch.
intanto , posto infover ;
OS: Windows 10 Version 2009
Word size of OS: 64-bit
Word size of FreeCAD: 64-bit
Version: 0.19.24291 (Git)
Build type: Release
Branch: releases/FreeCAD-0-19
Hash: 7b5e18a0759de778b74d3a5c17eba9cb815035ac
Python version: 3.8.6+
Qt version: 5.15.2
Coin version: 4.0.1
OCC version: 7.5.0
Locale: Italian/Italy (it_IT)
------------------------------
dunque nello specifico io vorrei per esempio realizzare una stella, faccio il disegno ed è ok, estrudo, e ho un solido a forma di stella,
adesso io vorrei che questa stella fosse vuota, ma alzando i bordi (vorrei stampare una stella cometa, farla cava per inserirci qualche lucetta di natale, quindi cava,ma devo poterla chiudere facendo combaciare i bordi.) ora se io avessi dovuto costruire una forma con le primitive, e creare una scatola rettangolare , non avrei problemi a farlo, disegno un rettangolo o un quadrato leggermente piu piuccolo e sottraggo le due forme, ma con gli strumenti che mette a disposizione lo sketch non riesco a farlo. l'ideale sarebbe (e comodo soprattuto) poterlo copiare e poi scalarlo, ma non c'è una funzione che mi scala l'oggetto (stella). dovrei quindi ridisegnare la forma manualmente o ci sono strumenti o procedure per farlo ?
grazie a chi mi risponderà.
User avatar
onekk
Veteran
Posts: 6146
Joined: Sat Jan 17, 2015 7:48 am
Contact:

Re: un aiutino sullo sketch

Post by onekk »

Puoi sempre usare una trasfromazione con le matrici e ottenere una scalatura, in pratica ad esempio:

1) prendi la faccia creata con sketch
2) estrudi a formare un solido dell'altezza corretta
3) scali la faccia in modo che sia più piccola (quanto dipende dallo spessore delle pareti verticali)
3) estrudi qualcosa meno la faccia rimpicciolita
4) sposti il solido interno della differenza tra le altezze (che ti daranno lo spessore delle pareti sopra e sotto)
5) fai un cut dal solido esterno con quello interno (per quello lo devi spostare come al punto 4)


Probabilment una volta ottenuto lo sketch potresti usare "Part WB" per fare tutto.

Io pero non uso molto la GUI per cui non sono affidabile con consigli in quel senso.

Saluti

Carlo D.
GitHub page: https://github.com/onekk/freecad-doc.
- In deep articles on FreeCAD.
- Learning how to model with scripting.
- Various other stuffs.

Blog: https://okkmkblog.wordpress.com/
tiberium
Posts: 2
Joined: Wed Dec 08, 2021 9:04 am

Re: un aiutino sullo sketch

Post by tiberium »

Allora , premetto che ho risolto manualmente ossia ridisegnando manualmente una sagoma inscritta, una stella piu piccola , estrusa e poi sottratta, cosi come faccio abitualmente con le primitive, solo che non ho capito dove sta il comando scala, o riduci o ridimensiona, ce ne sta uno draw, e non credo che tenga conto del mio solido ottenuto, o magari sono io che non ho ancora troppa dimestichezza. Credeco che esistesse molto piu banalmente una funzione riduci o ridimensiona , come in tutti i programmi di grafica, e che non riuscivo a tirarlo fuori. Grazie comunque per la risposta. Devo provare anche il tuo metodo. Grazie di nuovo
User avatar
onekk
Veteran
Posts: 6146
Joined: Sat Jan 17, 2015 7:48 am
Contact:

Re: un aiutino sullo sketch

Post by onekk »

Piccolo script, con qualche esempio:

Code: Select all

"""stella_example.py

   This code was written as an sample code 
     
   Author: Carlo Dormeletti
   Copyright: 2021
   Licence: CC BY-NC-ND 4.0 IT 
"""

import os
import os.path
import math

import FreeCAD
from FreeCAD import Placement, Rotation, Vector
import Part
import Path
import Draft


DOC_NAME = "stella_example"
    
DOC = FreeCAD.activeDocument()


def clear_doc():
    """
    Clear the active document deleting all the objects
    """
    for obj in DOC.Objects:
        try:
            DOC.removeObject(obj.Name)
        except Exception:
            pass

def create_doc(doc_name):
    obj = FreeCAD.newDocument(doc_name)
    return obj.Name

def setview():
    """Rearrange View"""
    DOC.recompute()
    VIEW.viewAxometric()
    VIEW.setAxisCross(True)
    VIEW.fitAll()

print(DOC)

if DOC is None:
    obj = create_doc(DOC_NAME)
    FreeCAD.setActiveDocument(obj)
    DOC = FreeCAD.activeDocument()
    VIEW = FreeCAD.Gui.ActiveDocument.ActiveView

else:
    if DOC.Name != DOC_NAME:
        obj = create_doc(DOC_NAME)
        FreeCAD.setActiveDocument(obj)
        DOC = FreeCAD.activeDocument()
        VIEW = FreeCAD.Gui.ActiveDocument.ActiveView
    else:
        DOC = FreeCAD.activeDocument()
        clear_doc()
        VIEW = FreeCAD.Gui.ActiveDocument.ActiveView


EPS = 0.10
EPS_C = EPS * -0.5

VZOR = Vector(0,0,0)
ROT0 = Rotation(0, 0, 0)

def poly(center=Vector(0, 0, 0), sides=6, dia=6, align=True):

    ang_dist = math.pi / sides
    
    rad = dia * 0.5

    theta = 0.0 if align else ang_dist

    print("Theta: ",theta)

    vertex = []

    for n_s in range(0, sides+1):
        vpx = rad * math.cos((2 * ang_dist * n_s) + theta) + center[0]
        vpy = rad * math.sin((2 * ang_dist * n_s) + theta) + center[1]
        vertex.append(Vector(vpx, vpy, 0))

    return vertex

lati = 8
diam_ext = 100
diam_int = 50

# ottengo i punti del poligono esterno
esterno = poly(Vector(0,0,0), lati, diam_ext, True)

# ottengo i punti del poligono interno
interno = poly(Vector(0,0,0), lati, diam_int, False)

# uso i punti per creare il polygono della stella
star_points = []
for p_idx, point in enumerate(esterno):
    star_points.append(point)
    star_points.append(interno[p_idx])

# va tolto l'ultimo punto aggiunto 
star_points.pop()
# aggiungi il primo punto per chiudere il poligono    
star_points.append(esterno[0])

print(star_points)

stella = Part.makePolygon(star_points)

face = Part.Face(stella)

e_alt = 30
spess = 2

DOC.recompute()

stella_ext = DOC.addObject("Part::Feature", "stella")
stella_ext.Shape = face.copy()
stella_ext.ViewObject.Visibility = False

# Non rispetta lo spessore esterno ho semplicemente calcolato un fattore di riduzione
sca_f = 0.80
stella_int = Draft.scale(stella_ext, Vector(sca_f, sca_f, 0.0), copy = True)
stella_int.Label = "stella_int"

solido_ext = face.extrude(Vector(0,0, e_alt))

solido_int = stella_int.Shape.extrude(Vector(0.0, 0.0, e_alt - (2.0 * spess)))
solido_int.Placement = Placement(Vector(0, 0, spess), ROT0)

stella_cava = solido_ext.cut(solido_int).removeSplitter()

solido_finale = DOC.addObject("Part::Feature", "stella_cava")
solido_finale.Shape = stella_cava
solido_finale.ViewObject.Transparency = 15


cs_len = diam_ext * 1.1
cs_wid = diam_ext * 1.1
cs_hei = e_alt + 2

cut_box = Part.makeBox(cs_len, cs_wid, cs_hei)
cut_box.Placement = Placement(Vector(cs_len * -0.5, cs_wid * -1, -1), ROT0)

DOC.recompute()

base_sez = stella_cava.copy()

sezione = base_sez.cut(cut_box).removeSplitter()

Part.show(sezione, "sezione")


DOC.recompute()

setview()

print("--- done ---")

Stella a otto punto in omaggio alla festività odierna (è il simbolo della madonna, "Stella Maris")

Se vuoi provare:


1) Salva il codice some file .py ad esempio "stella.py" è un normale file di testo
2) caricalo in FreeCAD, si apre l'editor delle Macro
3) lancia la macro con il pulsantone "freccia Verde" che dovrebbe apparire nella barra degli strumenti

modifica i parametri e rilancia per vedere cosa fanno, i nomi dovrebbero essere abbastanza chiari


la parte della scala è questa:

Code: Select all

sca_f = 0.80
stella_int = Draft.scale(stella_ext, Vector(sca_f, sca_f, 0.0), copy = True)
stella_int.Label = "stella_int"
Sembra complicato perché ho dovuto dare in past al Draft.scale un "oggetto documento".

Il lavoro potrebbe essere fatto duplicando semplicemente il calcolo del poligono con diametri diversi ed usandolo il poligono risultante al posto di stella_int.

Il solido finale, ho aggiunto trasparenza per visualizzare l'interno.
stella1.png
stella1.png (7.22 KiB) Viewed 2887 times
La sezione del solido.
stella2.png
stella2.png (4.51 KiB) Viewed 2887 times
le facce generatrici:
stella3.png
stella3.png (4.19 KiB) Viewed 2887 times
solo la faccia esterna
stella4.png
stella4.png (3.68 KiB) Viewed 2887 times



Saluti

Carlo D.
GitHub page: https://github.com/onekk/freecad-doc.
- In deep articles on FreeCAD.
- Learning how to model with scripting.
- Various other stuffs.

Blog: https://okkmkblog.wordpress.com/
Post Reply