automatizzare operazioni [Coffee]

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

Moderators: Arkimed, natas, visualtricks, cappellaiomatto

Post Reply
  • Advertising
User avatar
parlmc
Posts: 813
Joined: Thu Jun 23, 2005 6:25 pm

automatizzare operazioni [Coffee]

Post by 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...
Attachments
Untitled-1 copy.jpg
Untitled-2 copy.jpg
Untitled-2 copy.jpg (73.34 KiB) Viewed 1077 times
ciaociao,
Ros
User avatar
visualtricks
Moderatore
Posts: 3562
Joined: Thu Sep 23, 2004 5:13 pm
Location: Pistoia

Re: automatizzare operazioni [Coffee]

Post by 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:

Code: Select all

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:

Code: Select all

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 :)
Attachments
Schermata 2012-04-02 a 11.58.06.jpg
Image
๏_www.visualtricks.it_๏ .:: COMPUTER SAYS NO ::.
User avatar
parlmc
Posts: 813
Joined: Thu Jun 23, 2005 6:25 pm

Re: automatizzare operazioni [Coffee]

Post by 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
User avatar
visualtricks
Moderatore
Posts: 3562
Joined: Thu Sep 23, 2004 5:13 pm
Location: Pistoia

Re: automatizzare operazioni [Coffee]

Post by 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' :)
Image
๏_www.visualtricks.it_๏ .:: COMPUTER SAYS NO ::.
User avatar
visualtricks
Moderatore
Posts: 3562
Joined: Thu Sep 23, 2004 5:13 pm
Location: Pistoia

Re: automatizzare operazioni [Coffee]

Post by visualtricks »

Ho chiesto un aiutino su CGTalk, questo il risultato:

Code: Select all

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
Image
๏_www.visualtricks.it_๏ .:: COMPUTER SAYS NO ::.
User avatar
parlmc
Posts: 813
Joined: Thu Jun 23, 2005 6:25 pm

Re: automatizzare operazioni [Coffee]

Post by parlmc »

davvero grazie mille Visual !
;)
ciaociao,
Ros
User avatar
visualtricks
Moderatore
Posts: 3562
Joined: Thu Sep 23, 2004 5:13 pm
Location: Pistoia

Re: automatizzare operazioni [Coffee]

Post by visualtricks »

eheh prego, mi intrippo sempre su queste cose :)

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

Code: Select all

CallCommand(12236); //make editable
altrimenti se c'e' una primitiva dentro il nullo, l'oggetto risultato dal connect+delete è un poligono vuoto
Image
๏_www.visualtricks.it_๏ .:: COMPUTER SAYS NO ::.
User avatar
parlmc
Posts: 813
Joined: Thu Jun 23, 2005 6:25 pm

Re: automatizzare operazioni [Coffee]

Post by 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.

Code: Select all

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

Code: Select all

	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!
Attachments
esempio_001.rar
(78.78 KiB) Downloaded 51 times
ciaociao,
Ros
User avatar
visualtricks
Moderatore
Posts: 3562
Joined: Thu Sep 23, 2004 5:13 pm
Location: Pistoia

Re: automatizzare operazioni [Coffee]

Post by 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

Code: Select all

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
Image
๏_www.visualtricks.it_๏ .:: COMPUTER SAYS NO ::.
User avatar
parlmc
Posts: 813
Joined: Thu Jun 23, 2005 6:25 pm

Re: automatizzare operazioni [Coffee]

Post by 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!!
Attachments
esempio esportazione.rar
un file wrml2.0 che ho usato per test.
(72.59 KiB) Downloaded 45 times
select-delete_v2.0.rar
il file *.CSC dello script
(1.25 KiB) Downloaded 46 times
ciaociao,
Ros
  • Advertising
Post Reply