Nuova versione Guida allo Scripting

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

Nuova versione Guida allo Scripting

Post by onekk »

Buongiorno, dopo un lungo lavoro, ho pubblicato la versione 0.30 della guida.

Vi riporto il link al materiale.

Sarebbero molto graditi, commenti, e eventuali consigli su cosa è chiaro e su cosa non lo è, oltre che naturalmente correzione di errori ed inesattezze.

I commenti critici "sono molto apprezzati", quelli offensivi ovviamente di meno.

riporto il link alla pagina con il testo e i materiali allegati.

https://github.com/onekk/freecad-doc


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: Nuova versione Guida allo Scripting

Post by FCuser2019 »

Salve, complimenti per l'ottimo lavoro.
Quando avrò bisogno di fare qualche cosa con gli script, al tua guida sarà la prima cosa che consulterò.

Ho iniziato a dare una occhiata ed ho notato queste piccole cose:

pag.12, nel piccolo esempio di codice per chiarire il punto 3, sembra che ci siano gli spazi attorno ai punti, è realmente cosi?

pag.14, per maggiore chiarezza dove si dice: Un nome che comincia con un carattere di “ ”, sarebbe meglio esplicitare, almeno la prima volta, che ci si rferisce al carattere cosiddetto "trattino basso"

pag.14, penultimo rigo: e d --> ed

Ancora complimenti.
Ciao :)
User avatar
onekk
Veteran
Posts: 6222
Joined: Sat Jan 17, 2015 7:48 am
Contact:

Re: Nuova versione Guida allo Scripting

Post by onekk »

FCuser2019 wrote: Tue May 12, 2020 11:52 am Salve, complimenti per l'ottimo lavoro.
Quando avrò bisogno di fare qualche cosa con gli script, al tua guida sarà la prima cosa che consulterò.

Ho iniziato a dare una occhiata ed ho notato queste piccole cose:

pag.12, nel piccolo esempio di codice per chiarire il punto 3, sembra che ci siano gli spazi attorno ai punti, è realmente cosi?
No usando il carattere monospace, come in genere è meglio fare quando si scrive il codice ogni carattere occupa lo stesso spazio per cui il punto è al centro del riquadro carattere.
FCuser2019 wrote: Tue May 12, 2020 11:52 am pag.14, per maggiore chiarezza dove si dice: Un nome che comincia con un carattere di “ ”, sarebbe meglio esplicitare, almeno la prima volta, che ci si rferisce al carattere cosiddetto "trattino basso"
Grazie
FCuser2019 wrote: Tue May 12, 2020 11:52 am pag.14, penultimo rigo: e d --> ed

Ancora complimenti.
Ciao :)
Grazie

Ti ringrazio per le correzioni e per i complimenti, spero che sia chiaro, non farti scrupolo a segnalare parti oscure o anche solamente le tue impressioni, le critiche costruttive saranno sempre gradite.

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/
Luixx
Posts: 213
Joined: Thu Jan 25, 2018 9:12 am

Re: Nuova versione Guida allo Scripting

Post by Luixx »

salve, ultimamente i tuoi listati non funzionano perché manca la definizione a DOC

vedi output errore:

Code: Select all

Traceback (most recent call last):
  File "D:/nb-desktop/luigi/Documents/FreeCAD/onekk/aereo.py", line 99, in <module>
    aeroplano()
  File "D:/nb-desktop/luigi/Documents/FreeCAD/onekk/aereo.py", line 79, in aeroplano
    obj1 = base_cyl('primo cilindro', 360, diam_fus, lung_fus)
  File "D:/nb-desktop/luigi/Documents/FreeCAD/onekk/aereo.py", line 41, in base_cyl
    obj = DOC.addObject("Part::Cylinder", nome)
<class 'NameError'>: name 'DOC' is not defined
ecco l'errore preciso:

Code: Select all

<class 'NameError'>: name 'DOC' is not defined

versione freecad:

Code: Select all

OS: Windows 10 (10.0)
Word size of OS: 64-bit
Word size of FreeCAD: 64-bit
Version: 0.19.21857 (Git)
Build type: Release
Branch: master
Hash: 750c169a6cb999f084915494f2fbec7c07297aae
Python version: 3.6.8
Qt version: 5.12.1
Coin version: 4.0.0a
OCC version: 7.3.0
Locale: Italian/Italy (it_IT)

grazie mille puoi sistemare?


grazie e buon inizio settimana.
User avatar
onekk
Veteran
Posts: 6222
Joined: Sat Jan 17, 2015 7:48 am
Contact:

Re: Nuova versione Guida allo Scripting

Post by onekk »

Ciao, innanzitutto grazie della segnalazione.

La guida ha subito una modifica importante, molti listati non hanno la parte iniziale che è comune, e porta via molte righe di codice, sprecando inutilmente spazio.

La cosa è citata chiaramente a pagina 26 della versione 0.31 pubblicata al link della guiida.

Infatti nella pagina 41 dove viene presentato il listato del primo esempio nella intestazione dello scirpt è indicato chiaramente:

Attenzione : Questo listato va usato aggiungeno le linee
da 18 in poi al codice presente in sc - base . py


E se non ho compiuto errori questo è riportato anche in tutti i listati pubblicati sullo stesso sito.

Dai numeri di linea degli errori mi pare che l'aggiunta dellle righe contenute nel file sc-base.py non sia stata fatta.

La modifica è stata fatta anche per evitare di dover correggere in tutti i listati le inizializzazione, che ahimè hanno creato alcuni problemi in quanto tra le varie versioni di sviluppo e per diversi sistemi operativi, alcuni costrutti potrebbero cambiare, specie nelle sezioni di definizione dei nomi dei file (che a volte se includono i percorsi diventano delicati e soggetti alla interpretazione dei vari separatori di percorso).

Alcune cose in teoria sono state risolte con python 3.8, ma non ci faccio molto affidamento in quanto ogni giorni vengono scoperte particolarità e incongruenze specie in ambiente Windows.

Purtroppo non dispongo di una versione di Windows 10 e quella per Windows 7 è chiaramente obsoleta in quanto ha raggiunto il fine vita e non viene più mantenuto.

Prossimamente aggiungerò ad ogni listato un numero di versione nell'header in modo da poterci districare meglio tra le varie versioni e migliorie.

Al momento non ci sto lavorando, però ho intenzione di tornarci presto sopra per la correzzione degli errori, aggiungerò una migliore segnalazione della particolarità, in quanto mi sono accorto rileggendo il testo per verificare la tua segnalazione che non sono stato abbastanza chiaro nel punto giusto.

Sono comunque a disposizione per ogni tuo altro dubbio e segnalazione.

Grazie molte

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/
Luixx
Posts: 213
Joined: Thu Jan 25, 2018 9:12 am

Re: Nuova versione Guida allo Scripting

Post by Luixx »

ok, aggiunto le linee è partito ..

ma non si può fare una cosa tipo from scbase import *

etc..

grazie mille e buona giornata e grazie per la spiegazione.
User avatar
onekk
Veteran
Posts: 6222
Joined: Sat Jan 17, 2015 7:48 am
Contact:

Re: Nuova versione Guida allo Scripting

Post by onekk »

Scusa il ritardo.

In teoria è possibile, però il meccanismo di importazione di librerie esterne a volte crea problemi, è una cosa complicata da vedere, ma succede.

Il workaround è molto più complicato di un semplice copia e incolla.

Ovviamente stiamo parlando di listati di test, per cui è meglio avere "tutto in un solo punto", ho cercato di semplificare la cosa anche per problemi di impaginazione, le linee ripetute all'inizio allungavano in modo considerevole il numero di pagine, e non aggiungevano nulla alla chiarezza del testo in quanto "routine di servizio".

Al momento non sono molto attivo sul forum in quanto impegnato altrove (realizzazioni e riparazioni in casa, per cui passo molto tempo a disegnare e tagliare pezzi con la CNC) però ogni tanto ci ripasso.

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/
Luixx
Posts: 213
Joined: Thu Jan 25, 2018 9:12 am

Re: Nuova versione Guida allo Scripting

Post by Luixx »

salve, sto studiano python base e le api di freecad.. vorrei sapere se questo è giusto come codice.. oltre vorrei sapere come faccio fare una serie di numeri che dopo il vector e rotation di freecad capisca in sequenza di trattarli come semplici numeri.
tipo posto il codice che vorrei fare una classe o modulo FreeCAD-zero.
ti posto il primo oggetto "cubo".
grazie vedi .. è testato sotto windows .. in linux non so come se la prenda.. perché ultimamente linux ubuntu mi fa schifo per i snap .. sapevo benissimo usare la 18.04 .. perché i programmi si aggiornavano tutti senza problemi, invece con i snap il mio pc è lentissimo ad aprire i programmi installati da snap etc..
ecco il codice:

Code: Select all

import FreeCAD, Part
from FreeCAD import Base

doc = FreeCAD.ActiveDocument

class Cubo:
	def __init__(self, name):
		self.name = name
	
	def crea(self,x,y,z):
		self.x = x
		self.y = y
		self.z = z
		App.ActiveDocument.addObject("Part::Box",""  + self.name + "")
		App.ActiveDocument.ActiveObject.Label = self.name
		getattr(doc, self.name).Length = self.x
		getattr(doc, self.name).Width = self.y
		getattr(doc, self.name).Height= self.z
	def setPlacement(self, yaw, pitch, roll, pos, x , y, z):
		self.yaw = yaw
		self.pitch = pitch 
		self.roll = roll
		self.pos = pos		
		self.x = x
		self.y = y 
		self.z = z
		pos = getattr(doc, self.name).Placement.Base
		rot = FreeCAD.Rotation(self.yaw, self.pitch, self.roll)       
		centre = FreeCAD.Vector(x,y,z)            
		newplace = FreeCAD.Placement(pos,rot,centre)
		getattr(doc, self.name).Placement = newplace
	def show(self):
		App.ActiveDocument.recompute()

cubo1 = Cubo("cubo1")
cubo1.crea(10,10,10)
cubo1.setPlacement(2.3,10,20,30,0,0,0)
cubo1.show()

cubo2 = Cubo("cubo2")
cubo2.crea(30,40,50)
cubo2.setPlacement(2.3,10,20,30,0,0,0)
cubo2.show()
User avatar
onekk
Veteran
Posts: 6222
Joined: Sat Jan 17, 2015 7:48 am
Contact:

Re: Nuova versione Guida allo Scripting

Post by onekk »

Code: Select all

App.ActiveDocument.addObject("Part::Box",""  + self.name + "")
App.ActiveDocument.ActiveObject.Label = self.name
Se definisci sef.name come stringa non ti serve poi usare la concatenazione di stringhe vuote prima e dopo il nome
Label viene automaticamente assegnata quando crei l'oggetto con il nome di self.name, Label ti serve per modificarla dopo la creazione.

Da qualche parte nella guida ho cercato di spiegare la differenza tra obj.Name e obj.Label

Non capisco la seconda parte della domanda

Se descrivi l'oggetto come classe, una volta creato te lo trovi seplicemente come oggetto "cubo" ma il "tuo oggetto" cubo, cioè un contenitore vuoto con assegnata la variabile self.name

una volta creato chiami miocubo.create e gli assegni alcune proprietà, però come esempio mi pare che sia inutilmente complicato, a meno che poi tu non debba creare routine più complesse, un semplice metodo basta e avanza.

Anche perché poi gli oggetti o li crei come oggetti documento e allora li puoi già richiamare con il nome e modificare le caratteristiche, per cui non serve mettere in piedi una classe così complessa.

Il succoi è cosa vuoi ottenere?

se vuoi passare altri valori all'interno della classe Cubo crei semplicmeente altre variabili ad esempio:

Code: Select all

class Cubo:
	def __init__(self, name):
		self.name = name
		self.var1 = 0
		self.var2 = ""
		.... quello che vuoi va qui
			
	def crea(self,x,y,z):

.... le tue classi
	
	def valori_agg(self, var1, var2)
		self.var1 = var1
		self.var2 = var2
	
	
quando invochi Cubo.valori_agg(10, "stringa")

i tuoi valori self,vari1 e self.var2 vengono assegnati di conseguenza e li puoi trovare in:

obj = Cubo("Cubo1")
.... qui assegni i valori e poi li trovi in

var1_letto = obj.var1
var2_letto = obj.var2

ma nemmeno ti serve usare un metodo, se instazi in init la variabile,. poi ci accedi e la modifichi come vuoi semplicemente facendo:

obj.var1 = 10
obj.var2 = "stringa"

a meno di non dover effetture delle validazioni al momento dell'assegnazione è più veloce.

Spero di non aver travisato la tua richiesta.

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/
Luixx
Posts: 213
Joined: Thu Jan 25, 2018 9:12 am

Re: Nuova versione Guida allo Scripting

Post by Luixx »

Salve, .. vorrei sapere come posso mettere le coordinate della posizione e rotazione in uno script come questo...perché adesso sto andando tentativi e wiki su freecadweb.org anche se vedo ci sono pagine che fanno riferimento ad python 2.
ti mostro il codice:

Code: Select all

import FreeCAD
import Part
class Document():
	def __init__(self, doc):
		self.doc = doc
	def create(self):
		App.newDocument()
		App.setActiveDocument("" + self.doc + "")
		App.ActiveDocument=App.getDocument("" + self.doc + "")
		Gui.ActiveDocument=Gui.getDocument("" + self.doc + "")
	def refresh(self):
		App.ActiveDocument.recompute()
		Gui.SendMsgToActiveView("ViewFit")
		Gui.activeDocument().activeView().viewIsometric()

class box():
	def __init__(self, obj):
		self.obj = obj
	def create(self, height, length, width):	
		box = App.ActiveDocument.addObject("Part::Box", self.obj)
		box.Height = height
		box.Length = length
		box.Width = width
	def placement(self):
		box.Placement = App.Placement(App.Vector(1,1,1),App.Rotation(0,0,0,1))

doc = Document("Unnamed")
doc.create()
box1 = box("box1")
box1.create(10,20,60)
box1.placement()
doc.refresh()
Mi dici come fare?

grazie mille e buona notte e buona settimana.
Post Reply