[Risolto]Sketch non in parallelo

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!
DarkPhoinix
Posts: 77
Joined: Thu May 02, 2019 2:30 pm

Re: Sketch non in parallelo

Post by DarkPhoinix »

onekk wrote: Mon May 30, 2022 6:56 am Dopo qualche tempo di utilizzo di FC e non avendo usato altri programmi CAD, l'esperienza non è proprio male.

Si riesce a fare decisamente molto se non "quasi tutto", il problema principale è il flusso di lavoro.

Una cosa che in genere a volte può sfuggire è "il modo" in cui un programma CAD ragiona.

Tieni presente un paio di cose:

- FC è basato su OCCT (un motore CAD di livello industriale), ma un CAD non è solo il suo "motore di modellazione", + anche l'interfaccia utente.
- il modulo Part (o WB che dir si voglia) è l'interfaccia più a basso livello con OCCT
- gli altri moduli Part Design complreso sono delle "sovrastrutture" poste sopra "Part" che "cercano" di cemplificare il lavoro all'utente.

Io ho scelto tempo fa di lavorare a "basso livello" ed usando lo scripting, dato che FC non pone difficoltà ad usare un linguaggio di programmazione reale per "comandarlo".

L'esperienza è decisamente positiva, però anche li ho dovuto abituarmi ai concetti di base, alcune cose sono "scoccianti" ad esempio una primitiva come il "parallelepipedo" ha l'origine in (0,0,0) e se ti serve allineare un cubo con un cilindro lo devi sempre spostare per allineare i centri. Ma poi ci fai l'abitudine.

Nel tuo caso probabilmente sei incorso nel fatto che la "sovrastruttura" di "Part Design" presume che le cose debban andare in un certo modo e che gli orientamenti siano "quelli lì".

Come dice qualcuno più autorevole di me in altri forum di FC, bisogna tenere presente che il forum è "destinato a rimanere" e che probabilmente "nuovi utenti" fra qualche tempo leggeranno questi post, per cui a volte si pensa "ai posteri che leggeranno" per chiarire alcuni concetti.

Arriva sempre più gente "scocciata" dalle politiche di prezzo dei software CAD commerciali e le tue obiezioni non sono infrequenti, se cerhci in giro ci sono thread di decine di pagine di gente che arriva qui e dice che FC usa un sistema strano e completamente differente "da tutti gli altri CAD", e poi si scopre che hanno usato un paio di CAD e basta, e che ad esmepio il sistema adottato da FC è simile al CAD xxx.

Molte volte è sbagliato il flusso di lavoro e tu orienti lo sketch in modo scorretto dall'inizio, nel senso che lo orienti nel modo più comodo "secondo te" che non sempre è quello più comodo per il CAD, o per le rotazioni successive.

Tieni presente che FC ha almeno 24 modi diversi per specificare una rotazione, ma la cosa non è affatto visibile a meno di sapere ad esempio che il concetto di rotazione in 3D è semplicemente una convenzione, un occhio alla voce su WikiPedia (che non è una autorità, ma da una buona idea delle cose) a proposito di "angoli di eulero" ti apre un mondo, quindi definire normale una cosa è una "approssimazione esagerata", è semplicemente uno dei tanti modi, probabilmente il più usato, o il più compresibile, o il più insegnato nelle università.

Non volermente ti faccio un esempio banale successo a me, prima di comprendere il modo con cui FC modella, modellavo un poligono presumendo l'ordine orario dei vertici, salvo poi diventare matto quando aggiungevo degli archi alle linee del poligono.

Poi ho scoperto che FC usa la convenzione trigonometrica (quell delle spiegazione che trovi in giro a proposito di seno coseno tangente) per specificare i cerchi e gli archi usaando la "rotazione antioraria", e ovviamente il problema si è chiarito, se disegni in senso orario e unisci un arco che ha il suo "inizio" in senso antiorario, diventa "ovvio" che poi i segmenti hanno un orientamento "sbagliato", e devi "girare tutti gli archi".

Purtroppo questa cosa è scritta da qualche parte, ma non è spiegato il fatto che "diventa meno complicato" modellare anche i poligoni in "senso antiorario".

Ma qui andiamo nella "filosofia della grafica", viene normale pensare che l'orientamento degli assi sia quello cartesiano, eppure esistono notevoli eccezioni nei progammi di grafica che considerano l'origine in alto a sinistra, perché semplicemente perché erano stati progettati per i CRT che iniziavano la scansione dello schermo in "alto a sinistra" e quindi diventava naturale e toglieva un sacco di complicazioni usare l'ordine naturale imposto dall'elettronica.

Ora lo vediamo come una "inutile complicazione", però ai suoi tempi era semplicemente "il modo più semplice".

Tieni presente un secondo aspetto FC non essendo un software commerciale è decisamente più disponibile al cambiamento, non avendo "clienti paganti" da non deludere.

Però è anche un programma viene sviluppato da più di 20 anni, vedi il copyright:
© Juergen Riegel, Werner Mayer, Yorik van Havre and others 2001-2021
A proposito del copyright, Werner Mayer @wmayer and Yorik van Havre @yorik sono spesso nel forum e sono disponibilissimi a rispondere e a spiegare le cose, nonché a discutere di possibili futuri sviluppi, cosa non da poco e quasi sicuramente non presente in un programma a pagamento dove in genere il programmatore è ben protetto diestro il "servizio clienti" e magari non è nemmeno al corrente delle esigenze dei suoi utilizzatori.

Non è raro che ad esempio @wmayer posti a stretto giro delle modifiche al programma per venire incontro alle esigenze di qualche utente, o spieghi come ottenere quello che è problematico, però questo accade quasi sempre nel forum "python scripting and macro".

Non volermene, ma l'intento non è didattico, o apologetico, e semplicemente volto a ribadire alcuni concetti che putroppo non sono presenti nella documentazione e decisamente assenti da molti tutorial in rete.

Scusa il lungo OT, probabilmente con qualche inesattezza dato che qui siamo tutti "utenti" o volte "utonti" dato che nessuno è esente da errori, forse nemmeno io :-D (Come disse il prete dal pulpito in un antico adagio della mia zona)

Saluti

Carlo D.
Io ho usato "coppia carbone" la carta velina la uso da bambino mai trovati i disegni al contrario! comunque il tuo vecchio suggerimento mi ha salvato! ti posto il risultato. Mi interessa una tua critica sul lavoro svolto.
problema iniziale
STAFFA.FCStd
(61.71 KiB) Downloaded 75 times
User avatar
onekk
Veteran
Posts: 6144
Joined: Sat Jan 17, 2015 7:48 am
Contact:

Re: [Risolto]Sketch non in parallelo

Post by onekk »

Lo controllo domani oggi sono decisamente impegnato e non garantisco.

Ma io in genere modello con lo scripting per cui il mio giudizio e la critica valgono decisamente meno di quelli di @domad per esempio.

Io sono abbastanza ferrato in Python e qualcosina in Qt per la Gui ma più in la non vado (anche se non so come sono finito nei credits di FC).

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/
User avatar
onekk
Veteran
Posts: 6144
Joined: Sat Jan 17, 2015 7:48 am
Contact:

Re: [Risolto]Sketch non in parallelo

Post by onekk »

Ho dato una occhiata al disegno e mi sembra corretto.

Suggerimenti:

In genere io quando modello e devo ruotare le cose, cerco posizionare l'asse di rotazione in centro:

Ad esempio se dovessi moellare una staffa come quella nel disegno:

Code: Select all

"""Sample code.

This code was written as an sample code

Name: filename.py

Author: Carlo Dormeletti
Copyright: 2022
Licence: CC BY-NC-ND 4.0 IT
"""
import os # noqa
import sys  # noqa
import math # noqa
from math import pi, sin, cos # noqa

import FreeCAD
import FreeCADGui # noqa
from FreeCAD import Placement, Rotation, Vector # noqa
import Part # noqa
import DraftGeomUtils

DOC = FreeCAD.activeDocument()

DOC_NAME = "template"


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


def setview():
    """Rearrange View."""
    FreeCAD.Gui.SendMsgToActiveView("ViewFit")
    FreeCAD.Gui.activeDocument().activeView().viewAxometric()
    FreeCAD.Gui.activeDocument().activeView().setAxisCross(True)

if DOC is None:
    FreeCAD.newDocument(DOC_NAME)
    FreeCAD.setActiveDocument(DOC_NAME)
    DOC = FreeCAD.activeDocument()

else:

    clear_doc()

# EPS= tolerance to use to cut the parts
EPS = 0.10
EPS_C = EPS * -0.5
ROT0 = Rotation(0, 0, 0)


bo_len = 150
bo_wid = 50
bo_th = 25

rad_foro = 5
rad_allog = 10
prof_allog = 10

interasse = 100

brac_len = 300
brac_wid  = 50
brac_th = 20


body = Part.makeBox(bo_len, bo_wid, bo_th)
body.Placement = Placement(Vector(bo_len * -0.5, 0, 0), ROT0)

#Part.show(body, "corpo staffa")

foro = Part.makeCylinder(rad_foro, bo_th + EPS)

foro1 = foro.copy()
foro1.Placement = Placement(Vector(interasse * 0.5, bo_wid * 0.5, EPS_C), ROT0)

foro2 = foro.copy()
foro2.Placement = Placement(Vector(interasse * -0.5, bo_wid * 0.5, EPS_C), ROT0)

#Part.show(foro1, "foro_1")
#Part.show(foro2, "foro_2")


allog = Part.makeCylinder(rad_allog, prof_allog + EPS)

all1 = allog.copy()
all1.Placement = Placement(Vector(interasse * 0.5, bo_wid * 0.5, EPS * -1), ROT0)

all2 = allog.copy()
all2.Placement = Placement(Vector(interasse * -0.5, bo_wid * 0.5, EPS * -1), ROT0)

#Part.show(all1, "allogg_1")
#Part.show(all2, "allogg_2")

cut_obj1 = foro1.fuse((all1 ,)).removeSplitter()
cut_obj2 = foro2.fuse((all2 ,)).removeSplitter()

#Part.show(cut_obj1, "c_ogg_1")
#Part.show(cut_obj2, "c_ogg_2")


staffa = body.cut((cut_obj1, cut_obj2)).removeSplitter()

#Part.show(staffa, "staffa")

brac = Part.makeBox(brac_len, brac_wid, brac_th)
m = brac.Placement.Matrix
m.move(Vector(0, brac_wid * -0.5, brac_th * -0.999))
m.rotateZ(math.radians(90))

brac.Placement.Matrix = m

#Part.show(brac, "braccio")


staffa1 = staffa.copy()
ms1 = staffa1.Placement.Matrix
ms1.rotateX(math.radians(90))
ms1.move(Vector(0, brac_len, 0.0))

staffa1.Placement.Matrix = ms1

#Part.show(staffa1, "staffa1")


staffa2 = staffa.copy()
ms2 = staffa2.Placement.Matrix
ms2.rotateX(math.radians(90))
ms2.rotateZ(math.radians(180))

staffa2.Placement.Matrix = ms2

#Part.show(staffa2, "staffa2")


assem = brac.fuse((staffa1, staffa2)).removeSplitter()
Part.show(assem, "assieme")

DOC.recompute()

Che da luogo a questo
2022-05-31_staffa.png
2022-05-31_staffa.png (7.67 KiB) Viewed 1633 times
Nota la costruzione dele staffe nel codice e la poszione della staffa modello.

Se carichi il codice:
20220531-staffa.py
(2.83 KiB) Downloaded 68 times
e togli il segno si spunta alle istruzioni di Part.show() per i vari passaggi, vedi la successione delle rotazioni.

L'ordine di applicazione della matrice è importante, e ti permette di evitare una marea di calcoli, trucchetto molto usato as esempio negli esempi di @wmayer.


Una volta creato l'oggetto con l'origine nel punto più comodo, poi lo sposti dove vuoi.


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/
FCuser2019
Posts: 125
Joined: Fri Sep 13, 2019 12:15 pm

Re: [Risolto]Sketch non in parallelo

Post by FCuser2019 »

Salve, in allegato puoi vedere un possibile modello che utilizza: master sketch, carbon copy, espressioni e link riflessi.

staffa2.png
staffa2.png (104.16 KiB) Viewed 1601 times

Il modello è totalmente parametrico: è possibile, ad esempio, cambiare le dimensioni nel master sketch e/o la lunghezza di asta1 e l'assemblaggio si riadatta di conseguenza.

Il modello è sicuro dal punto di vista del TNP (https://wiki.freecadweb.org/Topological ... problem/it) in quanto gli sketch sono posizionati tramite (semplici) espressioni.
Attachments
staffa2.FCStd
(39.87 KiB) Downloaded 73 times
DarkPhoinix
Posts: 77
Joined: Thu May 02, 2019 2:30 pm

Re: [Risolto]Sketch non in parallelo

Post by DarkPhoinix »

sto leggendo il manuale ... Grazie a tutti per l'aiuto!
https://www.freecadweb.org/manual/a-fre ... ual_it.pdf
DarkPhoinix
Posts: 77
Joined: Thu May 02, 2019 2:30 pm

Re: [Risolto]Sketch non in parallelo

Post by DarkPhoinix »

FCuser2019 wrote: Tue May 31, 2022 11:23 am Salve, in allegato puoi vedere un possibile modello che utilizza: master sketch, carbon copy, espressioni e link riflessi.


staffa2.png


Il modello è totalmente parametrico: è possibile, ad esempio, cambiare le dimensioni nel master sketch e/o la lunghezza di asta1 e l'assemblaggio si riadatta di conseguenza.

Il modello è sicuro dal punto di vista del TNP (https://wiki.freecadweb.org/Topological ... problem/it) in quanto gli sketch sono posizionati tramite (semplici) espressioni.
molto interessante... gli do uno sguardo volentieri!
dopo averlo visto ... ho capito che sono una pippa tu con poco hai fatto tutto ! io per arrivare a quel risultato ho dovuto cancellare tutto un sacco di volte!
Last edited by DarkPhoinix on Tue May 31, 2022 8:38 pm, edited 1 time in total.
DarkPhoinix
Posts: 77
Joined: Thu May 02, 2019 2:30 pm

Re: [Risolto]Sketch non in parallelo

Post by DarkPhoinix »

onekk wrote: Tue May 31, 2022 7:06 am Ho dato una occhiata al disegno e mi sembra corretto.

Suggerimenti:

In genere io quando modello e devo ruotare le cose, cerco posizionare l'asse di rotazione in centro:

Ad esempio se dovessi moellare una staffa come quella nel disegno:

Code: Select all

"""Sample code.

This code was written as an sample code

Name: filename.py

Author: Carlo Dormeletti
Copyright: 2022
Licence: CC BY-NC-ND 4.0 IT
"""
import os # noqa
import sys  # noqa
import math # noqa
from math import pi, sin, cos # noqa

import FreeCAD
import FreeCADGui # noqa
from FreeCAD import Placement, Rotation, Vector # noqa
import Part # noqa
import DraftGeomUtils

DOC = FreeCAD.activeDocument()

DOC_NAME = "template"


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


def setview():
    """Rearrange View."""
    FreeCAD.Gui.SendMsgToActiveView("ViewFit")
    FreeCAD.Gui.activeDocument().activeView().viewAxometric()
    FreeCAD.Gui.activeDocument().activeView().setAxisCross(True)

if DOC is None:
    FreeCAD.newDocument(DOC_NAME)
    FreeCAD.setActiveDocument(DOC_NAME)
    DOC = FreeCAD.activeDocument()

else:

    clear_doc()

# EPS= tolerance to use to cut the parts
EPS = 0.10
EPS_C = EPS * -0.5
ROT0 = Rotation(0, 0, 0)


bo_len = 150
bo_wid = 50
bo_th = 25

rad_foro = 5
rad_allog = 10
prof_allog = 10

interasse = 100

brac_len = 300
brac_wid  = 50
brac_th = 20


body = Part.makeBox(bo_len, bo_wid, bo_th)
body.Placement = Placement(Vector(bo_len * -0.5, 0, 0), ROT0)

#Part.show(body, "corpo staffa")

foro = Part.makeCylinder(rad_foro, bo_th + EPS)

foro1 = foro.copy()
foro1.Placement = Placement(Vector(interasse * 0.5, bo_wid * 0.5, EPS_C), ROT0)

foro2 = foro.copy()
foro2.Placement = Placement(Vector(interasse * -0.5, bo_wid * 0.5, EPS_C), ROT0)

#Part.show(foro1, "foro_1")
#Part.show(foro2, "foro_2")


allog = Part.makeCylinder(rad_allog, prof_allog + EPS)

all1 = allog.copy()
all1.Placement = Placement(Vector(interasse * 0.5, bo_wid * 0.5, EPS * -1), ROT0)

all2 = allog.copy()
all2.Placement = Placement(Vector(interasse * -0.5, bo_wid * 0.5, EPS * -1), ROT0)

#Part.show(all1, "allogg_1")
#Part.show(all2, "allogg_2")

cut_obj1 = foro1.fuse((all1 ,)).removeSplitter()
cut_obj2 = foro2.fuse((all2 ,)).removeSplitter()

#Part.show(cut_obj1, "c_ogg_1")
#Part.show(cut_obj2, "c_ogg_2")


staffa = body.cut((cut_obj1, cut_obj2)).removeSplitter()

#Part.show(staffa, "staffa")

brac = Part.makeBox(brac_len, brac_wid, brac_th)
m = brac.Placement.Matrix
m.move(Vector(0, brac_wid * -0.5, brac_th * -0.999))
m.rotateZ(math.radians(90))

brac.Placement.Matrix = m

#Part.show(brac, "braccio")


staffa1 = staffa.copy()
ms1 = staffa1.Placement.Matrix
ms1.rotateX(math.radians(90))
ms1.move(Vector(0, brac_len, 0.0))

staffa1.Placement.Matrix = ms1

#Part.show(staffa1, "staffa1")


staffa2 = staffa.copy()
ms2 = staffa2.Placement.Matrix
ms2.rotateX(math.radians(90))
ms2.rotateZ(math.radians(180))

staffa2.Placement.Matrix = ms2

#Part.show(staffa2, "staffa2")


assem = brac.fuse((staffa1, staffa2)).removeSplitter()
Part.show(assem, "assieme")

DOC.recompute()

Che da luogo a questo

2022-05-31_staffa.png

Nota la costruzione dele staffe nel codice e la poszione della staffa modello.

Se carichi il codice:

20220531-staffa.py

e togli il segno si spunta alle istruzioni di Part.show() per i vari passaggi, vedi la successione delle rotazioni.

L'ordine di applicazione della matrice è importante, e ti permette di evitare una marea di calcoli, trucchetto molto usato as esempio negli esempi di @wmayer.


Una volta creato l'oggetto con l'origine nel punto più comodo, poi lo sposti dove vuoi.


Saluti

Carlo D.
adesso lo studio da quando sto usando la rotazione mi è tornata la voglia di fare!
User avatar
onekk
Veteran
Posts: 6144
Joined: Sat Jan 17, 2015 7:48 am
Contact:

Re: [Risolto]Sketch non in parallelo

Post by onekk »

DarkPhoinix wrote: Tue May 31, 2022 8:34 pm adesso lo studio da quando sto usando la rotazione mi è tornata la voglia di fare!

Lo scripting può essere uno strumento molto potente, anche perché ti permette di riutilizzare facilmente forme complesse con un semplice copia ed incolla, e poche modifiche, oltre a permettere una modellazione veramente paramterica.

Ovviamente per cose semplici può sembrare un lavoro decisamente complicato, però se paragoni anche il fattore "spazio", uno script occupa pochissimi kb o al massimo qualche MB il suo prodotto può essere anche di decine o centinaia di MB.

se poi devi posizionare un certo numero di cose, crei smeplicemente una lista di posizioni e con ciclo for sei a posto, 10, 100, 1000 posizioni cambiano di poco il codice, ovviamente se le posizioni sono diverse devi scriverti le coordinate 3d a mano, però copiare un oggetto, cmabiare la proprietà placement per 10, 100, 1000 volte dovrebbe impiegare decisamente più tempo.

In più se sbagli al massimo uccidi il processo di FC e correggi l'errore, senza perdere nulla della modellazione già fatta.

Se però non ti piace "pestare i tasti della tastiera" è tutto un altro discorso.

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