errore codice dopo la riapertura del file cad

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

errore codice dopo la riapertura del file cad

Postby Luixx » Mon May 10, 2021 2:38 pm

Salve, avevo scritto in quello in inglese ma mi hanno risposto ma non ho capito nulla.. e poi il forum non so come mai dice che ho superato i login ..
Io ogni tanto cancello i cookie perché alcuni siti che ho hanno problemi e devo cancellare i cookie e forse il forum mi ha bloccato perché dice che ho superato il massimo di login.

Vi allego file cosi potete vedere se si risolve levando gli errori che quando apro il disegno salvato e lo apro di nuovo mi da dei errori AppError etc..

uso FreeCAD 0.19.2 su windows (64bit).

EDIT:

Code: Select all

16:38:54  <class 'AttributeError'>: Module __main__ has no class Bolt
16:38:54  <class 'AttributeError'>: Module __main__ has no class ViewProviderBolt
Grazie mille e buona settimana.
Attachments
bolt.py
(6.44 KiB) Downloaded 26 times
bolt.FCStd
(8.17 KiB) Downloaded 16 times
User avatar
onekk
Posts: 963
Joined: Sat Jan 17, 2015 7:48 am
Contact:

Re: errore codice dopo la riapertura del file cad

Postby onekk » Tue May 11, 2021 9:48 am

Allora, quando apri il file bolt.FCStd lui cerca le classi:

Code: Select all

11:00:45  <string>(1)<class 'AttributeError'>: Module __main__ has no class Bolt
11:00:45  <string>(1)<class 'AttributeError'>: Module __main__ has no class ViewProviderBolt
Che sono correttamente create nel file bolts.py, però non essendo il file bolts.py nel suo percorso di ricerca dei moduli, non lo trova e quindi emette quell'errore.

Ora il problema è:

- come inserire il file modulo bolt.py come modulo che venga autocaricato da python al momento dell'esecuzione.

Probabilmente va trasformato in un WB e messo in Mod, al momento sto sperimentando, la cosa, se hai pazienza forse riesco a trovare la soluzione.

Saluti

Carlo D.
Il mio Blog: https://onekk-maker.blogspot.com/

Introduzione a FreeCAD in Italiano: https://github.com/onekk/freecad-doc
User avatar
onekk
Posts: 963
Joined: Sat Jan 17, 2015 7:48 am
Contact:

Re: errore codice dopo la riapertura del file cad

Postby onekk » Tue May 11, 2021 10:30 am

C'è da lavorarci però questo potrebbe essere l'inizio:

Creare una sottodirectory Bolts nella directory utente di FreeCAD quella dove ci sono le Marco nella sottodirectory "Macro"

in questa sottodirectory crea due file:

Init.py

con semplicmente:

Code: Select all

"""The Bolts initialization."""

print("Initialize Bolt")

import Bolts
e un secondo file Bolts.py che è una leggera modifica del tuo file bolt.py, dove le direttive import sopra sono leggermente modificate e l'esecuzione di makeBolt è commentata in fondo.

Code: Select all

import FreeCAD
import Part
from FreeCAD import Base
import math

__name__ = "Bolts"

...

...
#makeBolt()
Ora dovresti vedere quando il freecad Parte se lo fai partire da console, "initialize Bolt " stampato.


Se vai nella console python e batti:

Code: Select all

import Bolts

Bolts.makeBolt()
Ti dovrebbe creare l'oggetto, però non lo visualizza, probabilmente manca qualche integrazione da qualche parte.

EDIT: ho aggiunto una docstring a "makeBolt()" e la visualizzaz correttamente, e sembra anche funzionare l'integrazione all'interno del file, se modifico le proprietà l'oggetto viene ricalcolato e visualizzato, ora provo a salvare un file di prova e a vedere se lo carica correttamente.

EDIT2: creando un nuovo file FCStd, eseguendo i comandi riportati sopra in console e salvando il file, alla riapertura non dà più errori e visualizza correttamente.

Quindi riassumendo, con quel tipo di impostazione:

- carichi in automatico ed esegui i comandi in Init.py
- puoi importare Bolts con import Bolts e funziona anche l'introspezione in cosole, se aggiungi una "docstring" a makeBolt() dovresti pure vederla visualizzata se batti Bolts.makeBolt in console

Ci sto ancora lavorando, eventualmente si fa un post nel forum inglese e si chiedono lumi, però è un promettente inizio, o almeno spero.

Spero di essere stato utile.

Carlo D.
Il mio Blog: https://onekk-maker.blogspot.com/

Introduzione a FreeCAD in Italiano: https://github.com/onekk/freecad-doc
Luixx
Posts: 190
Joined: Thu Jan 25, 2018 9:12 am

Re: errore codice dopo la riapertura del file cad

Postby Luixx » Tue May 11, 2021 11:04 am

ok, aspetto la tua soluzione in tanto il file lo presto da qui:

http://ingegnerialibera.altervista.org/ ... utorial_05


e scaricato il file bolt.py.

vedi se capisci cosa manca al file .. vedi essendo che tu sai fare gli script.

grazie mille e buona giornata.
User avatar
onekk
Posts: 963
Joined: Sat Jan 17, 2015 7:48 am
Contact:

Re: errore codice dopo la riapertura del file cad

Postby onekk » Tue May 11, 2021 11:44 am

Ovviamente se usi una guida del 2015 hai grossi problemi con le cose attuali, molta acqua è passata sotto i ponti dal 2015 in FreeCAD.

Se le cose le hai prese da lì le differenze non sono granché, infatti al tuo file manca particamente un paio di righe e la giusta posizione, e un file "semplicissimo" per l'importazione senza sbattimenti.

Se leggi il mio post precedente, trovi tutto, ci sono due EDIT che dicono che sono riuscito a farlo funzionare.

Se serve altro chiedi, ma prima cerca di capire il codice, non è molto complicato.

Saluti

Carlo D.
Il mio Blog: https://onekk-maker.blogspot.com/

Introduzione a FreeCAD in Italiano: https://github.com/onekk/freecad-doc
Luixx
Posts: 190
Joined: Thu Jan 25, 2018 9:12 am

Re: errore codice dopo la riapertura del file cad

Postby Luixx » Tue May 11, 2021 11:55 am

ok, ok , ok ... ho capito allora era una macro??

pensavo che fosse un file unico

invece leggendo il tuo e rileggendo la guida.. ho risolto..

e non da errori.

ti ringrazio molto e buona giornata e grazie mille per l'aiuto .. prima e meglio che rileggo 10 volte cosi capisco da solo.

saluti e buona settiamana.
Luixx
Posts: 190
Joined: Thu Jan 25, 2018 9:12 am

Re: errore codice dopo la riapertura del file cad

Postby Luixx » Tue May 11, 2021 12:02 pm

soluzione:
from bolt import *
makeBolt()

e il file bolt.py va messo nella cartella macro

giusto?

e nella console digitare i seguenti passi di sopra.

era cosi?
User avatar
onekk
Posts: 963
Joined: Sat Jan 17, 2015 7:48 am
Contact:

Re: errore codice dopo la riapertura del file cad

Postby onekk » Tue May 11, 2021 1:48 pm

No allora ricapitolo in ordine:

Nella cartella "utente di FreeCAD", quella dove ci sono i file di sonfigurazione, i WB e le Macro esiste una sottocartella Mod


Passo 1:

Crei in quella sottocartella una cartella chimata Bolts.

Passo 2:

nella cartella Bolts crei un file chiamato Init.py nota la maiuscola all'inizio del file, (magari in windows non importa ma in Linux sì)

in quel file metti queste righe:

Code: Select all

"""The Bolts initialization."""


print("Initialize Bolt")

import Bolts
salvi e chiudi.

Passo 3:

Sempre nella cartella Bolts rinomini il tuo file bolts.py in Bolts.py

e modifichi le prime righe in questo modo:

Code: Select all

import FreeCAD
import Part
from FreeCAD import Base
import math

__name__ = "Bolts"

### fino a qui togli tutto dalla riga seguente in poi va bene tutto.
class Bolt:

L'ultima riga, quella che invoca makeBolt() la cancelli semplicemente.


Ora se lanci FreeCAD, viene eseguito il file Init.py che in pratica non fa nulla, se non dire a FreeCAD che in quella cartella esiste qualcosa che è disponibile. Apparentemente c'è un meccanismo ulteriore per far caricare in maniera automatica Bolts e renderla disponibile, come libreria.

Ma nella documentazione non è specificato bene il meccanismo, solo per InitGui.py è specificato uno schema di classe per inizializzare le cose, ma genera errori anche perché non ci sono altre cose da generare, non stiamo creano un WB completo, solo rendendo disponibile a FreeCAD delle cose.

Ora se nella console Python batti "a mano":

Code: Select all

import Bolts
vedrai che non genera nessun errore
e se batti:

Code: Select all

Bolts.makeBolt()
Ti dovrebbe creare se è tutto a posto il tuo bullone di default, permettendoti anche di modificarne le proprietà e di vedere le modifiche.

Devi comunque creare a mano un file di "disegno" con il menu nuovo file o con il bottone apposito, altrimenti dato che non hai messo dei check nella routine makeBolt per l'esistenza di un FreeCAD.ActiveDocument e l'eventuale creazione se non presente, ti darà errore.

Se salvi il file di "disegno" ad esempio come test-bolts.FCstd chiudi tutto, anche FreeCAD, riapri FreeCAD e carichi test-bolts.FCstd dovrebbe andare tutto senza errori.

Nota però che Windows è famoso per fare casini con i permessi di lettura e scrittura per cui se hai problemi, verifica i permessi di lettura e scrittura dei file nella cartella utente di FreeCAD.

in altri programmi c'è gente è diventata autenticamente matta prima di scoprire la cosa, il problema era legato al fatto che quel programma cercava il "file di licenza" nella directory utente e dato che era un file con un chiave alfanumerica lunga lo si copiava semplicemente dalla e-mail e lo si incollava nella "cartella utente" del programma.

All'avvio il programma non trovava il file e continuava a rompere le scatole che la versione non era autorizzata, fino a che non si sistemava l'inghippo dei permessi che cambiavano a seconda se si eseguiva il programma in automatico o lo si avviava in manuale con un file bat se non ricordo male.

Spero di essere stato maggiormente chiaro.

Saluti

Carlo D.
Il mio Blog: https://onekk-maker.blogspot.com/

Introduzione a FreeCAD in Italiano: https://github.com/onekk/freecad-doc
Luixx
Posts: 190
Joined: Thu Jan 25, 2018 9:12 am

Re: errore codice dopo la riapertura del file cad

Postby Luixx » Tue May 11, 2021 4:47 pm

ok, cosi come me lo hai spiegato adesso .. ha funzionato tutto.. ed sparito l'errore quando lo riapro..

grazie mille e buona serata.
User avatar
onekk
Posts: 963
Joined: Sat Jan 17, 2015 7:48 am
Contact:

Re: errore codice dopo la riapertura del file cad

Postby onekk » Tue May 11, 2021 5:28 pm

Prego, in pratica è un "mini WB" caricato automaticamente.

Quando riapri il file, lui trova da solo i suoi riferimenti.

Ovviamente se distribuisci il file con le tue modifiche, chi lo riceve non sarà in grado di leggerlo senza errori, probabilmente avrà il solido (ma non è garantito al 100%) ma se userà i controlli associati non funzioneranno perché non puoi salvare nel file FCStd delle macro.

Dovrai distribuire una copia del "mini WB" con le istruzioni su come metterlo nella directory "utente di FreeCAD" .

Un paio di esemp per "razionalizzare" il codice:

Esempio 1:
Questa scrittura

Code: Select all

import FreeCAD

from FreeCAD import Base
Quasi inutile

Code: Select all

from FreeCAD import Base, Rotation, Vector 
meglio così accorci di molto le scritture per i vettori e per la Rotazione.

Code: Select all

obj.Placement = FreeCAD.Placement(Vector(), Rotation())
al posto di:

Code: Select all

obj.Placement = FreeCAD.Placement(Base.Vector(), FreeCAD.Rotation())
Esempio 2:

un secondo consiglio, io in genere se devo fare molti Placement, creo degli aiuti:

Code: Select all

# uso gli import citate sopra per Vettori e rotazioni
VZOR = Vector(0,0,0)

# rotazione usando gli angoli di Tait Bryan quindi in ordine gli assi sono (ZYX)
ROT0 = Rotation(0,0,0)
RZ90 = Rotation(90,0,0) 
#ecc tutti le abbreviazioni che vuoi
Ti sbatterai molto meno a scrivere Vector(0,0,0) ecc.

Saluti

Carlo D.
Il mio Blog: https://onekk-maker.blogspot.com/

Introduzione a FreeCAD in Italiano: https://github.com/onekk/freecad-doc