COFFEE | Iteration, geht nicht ******!

Hi!

i=i+1; ist das gleiche wie i++;

Die Fehlermeldung ist klar: beim letzten Durchlaufen der Schleife ist obj->GetNext() gleich Null, d.h. obj wird Null. Eine Zeile später fragst Du aber dieses nicht existierende Objekt nach seinem obj->GetFirstTag(), das ergibt den Fehler. Also z.B. die letzte Zeile der Schleife mit "if (obj)" nur bei existierendem Objekt ausführen lassen.
Dies gilt übrigens auch für den Anfang Deines Scipts: wenn kein Objekt selektiert ist, sollte es Abbrechen. Mit z.B. "if (!obj) return false;".

Die Tags kannst Du - wie die Objekte - mit GetNext durchlaufen. Mit "instanceof(ttag,TextureTag)" kannst Du die Texture-Tags dabei herausfiltern und bearbeiten.

Bzgl. Dialog schau Dir am besten die "Example Files" der Coffee SDK an: "Dialogs" :)

Liebe Grüße,
Mark.
 
Asoo ^^

Hab die Fehlermeldung jetzt behoben :)

Klasse funktioniert wunderbar ! ;)

Mach ich nachher jetz hab ich erstmal meinen Skrip fertig gemacht, so, dass er funktioniert :D


Ein kleines Problemchen besteht noch.
Die Offset Werte werden zwar wie gewüsncht gesetzt, allerdings muss man zum aktualisieren jeden einzelnen Tag anklicken.
Warum ist das so ?!

Einfach das zuletzt bearbeitete Tag selektieren funktioniert irgednwie nicht.. :/

PHP:
while (obj)
{
   [...]
   doc->SetActiveTag(obj,obj_tag);
   [...]
}

lg nux
 
Zuletzt bearbeitet:
Hi!

@Update: Sende mal ein "Update" nach der Schleife -> "doc->MultiMessage(MSG_UPDATE);"

@TextureTags: Was hast Du vor?! Du willst doch jeweils das erste Texture-Tag des aktuellen Objekts der Schleife finden, oder?
Code:
var obj_tag = obj->GetFirstTag();
		while (obj_tag && !instanceof(obj_tag,TextureTag)) {
			obj_tag = obj_tag->GetNext();
		}

Liebe Grüße,
Mark.
 
Das doc->SetActiveObject(obj,obj_tag) war dazu gedacht automatishc die Tags zu selektieren.
Denn beim selektieren werde die Tags aktualisiert. ;-)


@Update: Das funktioniert auch nicht :/
Ich habs auch schon mit
PHP:
obj_tag->Message(MSG_UPDATE);
innerhalb der Schleife probiert aber das funktioniert ebenfalls nicht.


Hier mal der volle Skript:

PHP:
//*by Niklas Rosenstein*//
//**********************//
//*****Variables********//


//Random Value
var rndm = new(Random);
rndm->Init(2389294);
rndm = rndm->Get01();
println("Random value = ", tostring(rndm));
var it = rndm;

//ActiveObject
var obj = doc->GetActiveObject();
if (!obj)
{
	TextDialog("No Object selected.", DLG_OK);
	return false;
}

//TextureTagTest
var obj_tag = obj->GetFirstTag();

if (!obj_tag)																
{
	TextDialog("No Tags available.", DLG_OK);
	return false;
}
while (obj_tag->GetType() != ttexture)					
{

	println(obj->GetName(),": '", obj_tag->GetName(),"'", " is no texturetag. Getting next tag");
	obj_tag = obj_tag->GetNext();
	if (!obj_tag)
	{
		TextDialog((obj->GetName() + ": no texturetags on this Object"), DLG_OK);
		doc->SetActiveObject(obj);
		return false;
	}

	
}

//BaseContainer
var bc = obj_tag->GetContainer();



//*****Action*****//
//****************//

while (obj)
{
    it = it+1;

    bc->SetData(TEXTURETAG_OFFSETX, (it*rndm));
    bc->SetData(TEXTURETAG_OFFSETY, (it*rndm));
    obj_tag->SetContainer(bc);

		println(obj->GetName(),": ", obj_tag->GetName(), ": OffsetX/Y: ", it*rndm*100, " %");
    obj = obj->GetNext();

		if (!obj)	return false;

    obj_tag = obj->GetFirstTag();

		if (!obj_tag)																
		{
			TextDialog("No Tags available.", DLG_OK);
			return false;
		}

		while (obj_tag->GetType() != ttexture)					
		{

			println(obj->GetName(),": '", obj_tag->GetName(),"'", " is no texturetag. Getting next tag");
			obj_tag = obj_tag->GetNext();
			if (!obj_tag)
			{
				TextDialog((obj->GetName() + ": no texturetags on this Object"), DLG_OK);
				doc->SetActiveObject(obj);
				return false;
			}
	
		}

}

Und das mit den Dialogen, die examples von der R12 doc funktionieren in der R11.5 alle nicht und in der R11.5 doc gibt es irgendwie kein dialog ?!
Ausserdem sind die Beispiele alle MEGA AUFWÄDING nur für son läppischen dialog O_O

lg nux
 
Zuletzt bearbeitet:
Hi!

Hm, leider verstehe ich Dein Script nicht ... Wieso holst Du ein Texture-Tag VOR der Objekt-Schleife und nicht nur darin? Warum gibst Du bereits beim zweiten Tag eine Fehlermeldung aus, wenn dieses kein Texture-Tag ist? Es könnte ja auch erst das dritte Tag ein Texture-Tag sein...

Somit mal anders:
Code:
main(doc,op)
{

var obj = doc->GetActiveObject();
if (!obj) return false;
obj = obj->GetDown();

var rndm = new(Random);
rndm->Init(2389294);
rndm = rndm->Get01();

var it = 0;

// Objekte der Hierarchie
while (obj)
{
	it++;
		
	// Erstes TextureTag finden
	var obj_tag = obj->GetFirstTag();
	while (obj_tag && !instanceof(obj_tag,TextureTag)) {
		obj_tag = obj_tag->GetNext();
	}

	if (obj_tag) {
		var bc = obj_tag->GetContainer();
		bc->SetData(TEXTURETAG_OFFSETX, (it*rndm));
		bc->SetData(TEXTURETAG_OFFSETY, (it*rndm));
		obj_tag->SetContainer(bc);
		obj_tag->Message(MSG_UPDATE);
	}
	obj->Message(MSG_UPDATE);

	obj = obj->GetNext();
}

EventAdd();
doc->Message(MSG_UPDATE);

}
Doofe dabei: der "Refresh" will mir auch nicht gelingen, muß da noch mal schauen :(

Liebe Grüße,
Mark.
 
Hi nochmal!

@Dialog: naja, soviel Code ist das doch nun auch nicht, oder?

Code:
var wert;

// Dialog
class MyDialog : GeModalDialog {
	public:
	CreateLayout();
	Init();
	Command(id, msg);
};

MyDialog::CreateLayout() {
	SetTitle("Mein Dialog");
	AddGroupBeginV(0, 0, 2, "", 0);
		AddStaticText(1001, BFH_FIT, 0, 0, "Zahl", 0);
		AddEditNumber(1002, BFH_FIT, 200, 0);
	AddGroupEnd();
	AddDlgGroup(DR_DLGGROUP_OK|DR_DLGGROUP_CANCEL);
}
MyDialog::Init() {
	SetFloat(1002, 0.0, 0.0, 100.0, 0.1);
}
MyDialog::Command(id, msg) {
	wert = float(GetFloat(1002));
}

Liebe Grüße,
Mark.
 
Ahh ich verstehe deinen Skript nun, nach ein paar mal durchlesen. ;)
Deutlich kompakter als meiner.

Ich hab das ganze wohl äusserst umständlich verfasst.
Aber solange es funktioniert .. :D


@Dialog:
Nur versteh ich ef noch nicht alle Funktionen und der Grund wieso da die Funktion steht usw. :D

Und dieser Dialog ist deutlich kleiner als einer der bei den Examples steht.

Werd mir das genauer anschauen und in die 1.2 einbauen :D

@Update:
Wirklich komisch. :(
Ist total umständlich wenn es viele Objekte sind, jeden Tag anzuklicken...

lg nux

PS: Wenn ich deinen Skript für das Dialogfenster einfüge kommt eine Fehlermeldung in der Konsole.

Line 4, Pos 7: Expression expected.

Das kommt immer wenn ich ne Klasse definieren will oder sowas .. :/
 
Zuletzt bearbeitet:
Hi!
Ich hab das ganze wohl äusserst umständlich verfasst.
Aber solange es funktioniert .. :D
Ich behaupte, es hat nicht "funktioniert"... ;)

PS: Wenn ich deinen Skript für das Dialogfenster einfüge kommt eine Fehlermeldung in der Konsole.

Line 4, Pos 7: Expression expected.

Das kommt immer wenn ich ne Klasse definieren will oder sowas .. :/
Der anschließende Code muß in der Funktion "main" definiert werden:
Code:
main(doc, op) {
...
}
So kann übrigens "op" als das gerade aktive Objekt - also statt doc->GetActiveObject() - genutzt werden...

Liebe Grüße,
Mark.
 
Hi!

...und Du hast Dir die Examples WIRKLICH mal angesehen?! ;)
Code:
var wert;

// Dialog
class MyDialog : GeModalDialog {
	public:
	CreateLayout();
	Init();
	Command(id, msg);
};

MyDialog::CreateLayout() {
	SetTitle("Mein Dialog");
	AddGroupBeginV(0, 0, 2, "", 0);
		AddStaticText(1001, BFH_FIT, 0, 0, "Zahl", 0);
		AddEditNumber(1002, BFH_FIT, 200, 0);
	AddGroupEnd();
	AddDlgGroup(DR_DLGGROUP_OK|DR_DLGGROUP_CANCEL);
}

MyDialog::Init() {
	SetFloat(1002, 0.0, 0.0, 100.0, 0.1);
}

MyDialog::Command(id, msg) {
	wert = float(GetFloat(1002));
}

// Main
main(doc,op)
{
	var dlg = new(MyDialog);
	dlg->Open(-1,-1);
	if (!dlg->GetResult()) return FALSE; 
	println(wert);
}

Liebe Grüße,
Mark.
 

Neue Beiträge

Zurück