automatizzare operazioni [Coffee]

Forum per: Modellazione, Texturing, Animazione, Composting e tutto quello che riguarda il normale utilizzo di Cinema4D.

Moderatori: Arkimed, natas, visualtricks, cappellaiomatto

Rispondi
  • Advertising
Avatar utente
parlmc
Messaggi: 813
Iscritto il: gio giu 23, 2005 6:25 pm

automatizzare operazioni [Coffee]

Messaggio da parlmc »

ciao a tutti,
è un po' che non scrivo sul forum [miss u all!!! :( ] purtroppo devo disturbarvi con una richiesta.
recentemente mi sono trovato a dover lavorare con dei modelli importati da un modellatore NURBS dal quale non riesco ad estrarre dei modelli poligonali facilmete lavorabili. ora il problema è che dovrei automatizzare per qualche centinaio di pezzi -ad ogni esportazione- la procedura che vi ho esemplificato nelle immagini [Seleziona Figli -> Connetti+Cancella] visto che farla a mano è laboriosissimo!
qualche tempo fa mi ero trovato tra le mani uno script che faceva da equivalente dei comandi di Azione di Photoshop, cioè registrava le azioni dell'utente e le ripeteva, purtroppo non riesco in nessun modo nè a ritrovarlo, nè a riscriverlo.

se qualcuno ha un po' più di memoria o riesce a darmi qualche dritta è il benvenuto!
[adesso sono sulla R13, ma ricordo che lo avevo usato sulla R11, quindi non dovrebbe essere pyton]

grazie in anticipo a tutti!!!
ps. se serve qualche altro chiarimento, non avete che da chiedere...
Allegati
Untitled-1 copy.jpg
Untitled-2 copy.jpg
Untitled-2 copy.jpg (73.34 KiB) Visto 1070 volte
ciaociao,
Ros
Avatar utente
visualtricks
Moderatore
Messaggi: 3562
Iscritto il: gio set 23, 2004 5:13 pm
Località: Pistoia

Re: automatizzare operazioni [Coffee]

Messaggio da visualtricks »

Ciao Palmrc,

puoi crearti uno script praticamente senza scrivere una riga di codice, fai così:

• apri lo Script Manager e dal menù File scegli New: ti crea uno script vuoto che di default ha un solo comando:

Codice: Seleziona tutto

main(doc,op)
{
	TextDialog("Hello World!", GEMB_OK);
}
• cancella la riga del dialogo lasciando le altre
• dal menù Window scegli Customization -> Customize commands (ti si apre la finestra con la lista di tutti i comandi possibili)
• cerca il comando Select Children e trascinalo nello script manager, vedrai che ti crea automaticamente il codice x quel comando
• cerca Connect Objects + delete e fai la stessa cosa, mettendolo dopo il primo comando
• ti dovresti ritrovare con questo codice:

Codice: Seleziona tutto

main(doc,op)
{
CallCommand(100004768);
CallCommand(16768);
}
• Salva lo script
• trascina l'icona dello script (dallo scritp manager) nell'interfaccia, così ce l'hai a portata di mano. Da qui in poi basta selezionare l'oggetto padre e cliccare l'icona dello script. Non è proprio come farlo automaticamente su tutti gli oggetti ma dovrebbe velocizzare un po' le cose :)
Allegati
Schermata 2012-04-02 a 11.58.06.jpg
Immagine
๏_www.visualtricks.it_๏ .:: COMPUTER SAYS NO ::.
Avatar utente
parlmc
Messaggi: 813
Iscritto il: gio giu 23, 2005 6:25 pm

Re: automatizzare operazioni [Coffee]

Messaggio da parlmc »

grazie mille,
ci ero arrivato anch'io proprio adesso!
[ma è davvero ottimo avere una conferma da parte tua]
adesso stavo provando a vedere se riesco ad infilarlo in un nodo COFFEE a fianco ad un nodo Hierarchy di Xpresso così è capace che me li ripete su tutti i figli e risolvo il problema alla radice.

se hai altri suggermienti sull'argomento sono tutt'orecchi
grazie ancora !
ciaociao,
Ros
Avatar utente
visualtricks
Moderatore
Messaggi: 3562
Iscritto il: gio set 23, 2004 5:13 pm
Località: Pistoia

Re: automatizzare operazioni [Coffee]

Messaggio da visualtricks »

mm non credo sia così semplice perchè anche se scorri tra gli oggetti con il nodo Hierarchy (e magari un Iterator) non te li seleziona nel manager oggetti, quindi quando arrivi a dare il CallCommand, fallisce xkè non ci sono oggetti selezionati.
È sicuramente fattibile all'interno di uno script ma dovrei studiarci un po' :)
Immagine
๏_www.visualtricks.it_๏ .:: COMPUTER SAYS NO ::.
Avatar utente
visualtricks
Moderatore
Messaggi: 3562
Iscritto il: gio set 23, 2004 5:13 pm
Località: Pistoia

Re: automatizzare operazioni [Coffee]

Messaggio da visualtricks »

Ho chiesto un aiutino su CGTalk, questo il risultato:

Codice: Seleziona tutto

main(doc, op)
{
var result = TextDialog("There is no coming back. Are You Sure ?", DLG_OKCANCEL);
if (result == DLG_R_OK) {
var obj = doc->GetFirstObject();
 while(obj)
 {
	doc->SetActiveObject(obj);
	var next = obj->GetNext();
	CallCommand(100004768); // Select Children
        CallCommand(12236); //make editable
	//obj->DelBit(BIT_AOBJ);  // Uncomment if you want to keep the Nulls
	CallCommand(16768);     // connect and delete
	obj = next;
 }
}
}
funziona alla grande :) Tieni presente che l'operazione non è annullabile..ti conviene farlo sempre su una scena vuota fatta appositamente ! (ho aggiunto un dialogo di conferma per sicurezza)

post su CGTAlk: http://forums.cgsociety.org/showthread. ... &t=1044069
Immagine
๏_www.visualtricks.it_๏ .:: COMPUTER SAYS NO ::.
Avatar utente
parlmc
Messaggi: 813
Iscritto il: gio giu 23, 2005 6:25 pm

Re: automatizzare operazioni [Coffee]

Messaggio da parlmc »

davvero grazie mille Visual !
;)
ciaociao,
Ros
Avatar utente
visualtricks
Moderatore
Messaggi: 3562
Iscritto il: gio set 23, 2004 5:13 pm
Località: Pistoia

Re: automatizzare operazioni [Coffee]

Messaggio da visualtricks »

eheh prego, mi intrippo sempre su queste cose :)

Tra l'altro sarebbe bene inserire dopo il primo CallCommand anche questo:

Codice: Seleziona tutto

CallCommand(12236); //make editable
altrimenti se c'e' una primitiva dentro il nullo, l'oggetto risultato dal connect+delete è un poligono vuoto
Immagine
๏_www.visualtricks.it_๏ .:: COMPUTER SAYS NO ::.
Avatar utente
parlmc
Messaggi: 813
Iscritto il: gio giu 23, 2005 6:25 pm

Re: automatizzare operazioni [Coffee]

Messaggio da parlmc »

ciao a tutti,
allora, aggiungo un po' di informazioni prima di continuare, così, nel caso, il quadro è più chiaro.
lo script di cui sopra serve a ripulire in fretta degli assemblati meccanici esportati tramite VRML2.0 da ThinkDesign.

l'esportazione genera:
- quattro camere e due luci infinite [da buttare];
- un oggetto nullo "Model";
- i figli di "Model" che, a loro volta, raggruppano per mesh separate le features che definiscono il pezzo con i relativi Tags associati.

ora, al netto di tutto, il file di partenza è omologo a quello di esempio [esempio_001.c4d]

ad adesso il codice arriva a qui:
- pulisce gli oggetti inutili;
- rende ogni oggetto una mesh unica e ottimizza;
- cancella tutti i tag.

Codice: Seleziona tutto

main(doc,op)
{
	
	var obj = doc->GetFirstObject();
	var i;
	for (i = 1; i <= 6; i++)
	{
    //TextDialog("Hello World!", GEMB_OK);
		//doc->SetActiveObject(obj);
		var next = obj->GetNext();
		obj->Remove();
		//CallCommand(100004787); // Delete
		obj = next;
	}
	doc->SetActiveObject(obj);
	CallCommand(1019951); // Delete Without Children

	var obj = doc->GetFirstObject();
  while(obj)
	{
		doc->SetActiveObject(obj);
    var next = obj->GetNext();
    CallCommand(100004768); // Select Children
    CallCommand(12236); //make editable
    //obj->DelBit(BIT_AOBJ);  // Uncomment if you want to keep the Nulls
    CallCommand(16768);     // connect and delete
    CallCommand(14039);     // optimize
    obj = next;
	}
  //---------------------------------------------------

	obj = doc->GetFirstObject();
	while(obj)
	{
		var next = obj->GetNext();
		//TextDialog("while sugli OBJ", GEMB_OK);
		var tag_d = obj->GetFirstTag();
		while(tag_d)
		{
			//TextDialog("while sui TAG", GEMB_OK);
			tag_d->Remove();
			tag_d = obj->GetFirstTag();
		}		
		obj = next;
	}
	
}
le cose che servirebbero adesso sono associare un nuovo Tag Phong ad ogni oggetto con angolo limite 80°.
adesso sto leggendo l'SDK ma non sono riuscito a tirare fuori nulla di buono usando

Codice: Seleziona tutto

	obj = doc->GetFirstObject();
	while(obj)
	{
		var next = obj->GetNext();
		//TextDialog("while sugli OBJ", GEMB_OK);
		var tag_d = obj->GetFirstTag();
		while(tag_d)
		{
			//TextDialog("while sui TAG", GEMB_OK);
			tag_d->Remove();
			tag_d = obj->GetFirstTag();
		}		
		obj = next;
	}
grazie ancora a tutti!
Allegati
esempio_001.rar
(78.78 KiB) Scaricato 51 volte
ciaociao,
Ros
Avatar utente
visualtricks
Moderatore
Messaggi: 3562
Iscritto il: gio set 23, 2004 5:13 pm
Località: Pistoia

Re: automatizzare operazioni [Coffee]

Messaggio da visualtricks »

ciao palmrc,
per assegnare un nuovo tag ad un oggetto devi fare due passaggi:
• assegnare il tag ad una variabile
• inserire il tag sull'oggetto
tra le due operazioni devi impostare gli eventuali valori del tag. Tutto questo devi farlo sull'oggetto di volta in volta attivo nel loop. Sul momento non ho modo di provare lo script ma a naso il loop dovrebbe essere qualcosa del genere

Codice: Seleziona tutto

obj->SetBit(BIT_ACTIVE); //seleziona l'oggetto
var newtag = AllocTag(Tphong); //mette in memoria un nuovo tag di tipo phong
newtag#PHONGTAG_PHONG_ANGLE = 80;   //imposta 80 come angolo 
obj->InsertTag(newtag); //assegna il tag all'oggetto selezionato
Immagine
๏_www.visualtricks.it_๏ .:: COMPUTER SAYS NO ::.
Avatar utente
parlmc
Messaggi: 813
Iscritto il: gio giu 23, 2005 6:25 pm

Re: automatizzare operazioni [Coffee]

Messaggio da parlmc »

ciao a tutti,

dopo parecchi tentativi corredati da numerosi [nonché indicibili] impropèri, dovremmo esserci.
ve lo lascio qui. magari, se qualcuno utilizza dei modellatori meccanici [Inventor, SolidWorks, etc... ] e vuole fare un test di importazione tramite VRML2.0 , possiamo sapere che funziona per tutti gli altri sw e non solo per ThinkDesign.

funzionamento:
- aprite il file *.WRL e lanciate lo script

lo script elimina gli oggetti scenici [camere, luci], unisce le mesh e ottimizza i punti duplicati, cancella i tag Texture duplicati e relativi tag Selection e tiene solo il tag Teture base, aggiunge un tag Phong con angolo limite 80°, ri-raggruppa il tutto in un oggetto nullo.
segnalatemi degli errori se volete... nei limiti del possibile provo a sistemarlo. :?:

ps. grazie mille Visualtricks :mrgreen: , se non fosse stato per il tuo aiuto non sarei arrivato da nessuna parte!!
Allegati
esempio esportazione.rar
un file wrml2.0 che ho usato per test.
(72.59 KiB) Scaricato 45 volte
select-delete_v2.0.rar
il file *.CSC dello script
(1.25 KiB) Scaricato 46 volte
ciaociao,
Ros
  • Advertising
Rispondi