Links auf Objekte in Hyperfile bzw. Container

Orbit

Erfahrenes Mitglied
Hey,
ich muss in einem PluginTag auf die Hyperfile irgendwie verweise auf mehrere Objekte speichern.
Da HyperFile dies nicht anbietet habe ich res mit einem Container versucht.
Aber der scheint die Verweise nicht laden zu können (ich erkenne den Container, seine ID etc aber die Verweise sind immer NIL)...
Weiß wer woran das liegen kann? bzw. natürlich hat wer ne andere Idee zum Speichern?
grüße,
Orbit


EDIT::
liegt es vielleicht daran, dass ein Plugin VOR den Objekten geladen wird?
So dass es die Objekte auf die verwiesen wird einfach noch nicht gibt?
 
Zuletzt bearbeitet:
Hi!

Kannst Du nicht einfach im .res File Deines PluginTags Link-Felder erstellen, die gehiddet sind? C4D sollte sich dann um den Rest kümmern...?

Liebe Grüße,
Mark.
 
Hmm ich hab in nem Tag nen Fenster wo man per Drag & Drop Objekte (Würfel etc) reinladne kann. Diese werden dann als Objekt im tag gespeichert - also nicht extern, aber es muss ein verweiß auf die Internen Objekte vorhanden sein.
Und die kann ich nicht im Container speichern und an die hyperfile übergeben... alles müll was ich bisher versucht habe aber das muss doch gehen?
Ein Container bietet die möglichkeit SetObject(id, obj), wobei da eben ein verweis gespeichert wird. Wenn ich dass ohne Umwege über hyperfile mache geht das alles. Aber sobald ich dann speichere und lade kommt da müll raus (er will mir immer erzählen dass das ein Integer ist und kein Objekt.. manchmal kommt auch NIL raus).

Ich bin grad voll am verzweifeln.. mein schönes PlugIn... :[
Gruß,
Orbit
 
Hallo,
hier mal der COde wie er bisher aussieht:
Code:
PluginTag::Save(hf){
    var cont = new(BaseContainer, 10);
    cont->SetData(1, 144);
    cont->SetObject(10, OBJECT);
    hf->WriteContainer(cont);
}

Code:
PluginTag::Load(hf){
    var cont= hf->ReadContainer();
    println(tostring(cont->GetData(1)));
    var d = cont->GetObject(10, GetActiveDocument(), BaseDocument);
    println(d->GetName());
}

Ausgabe beim Laden:
144,
Incompatible values: INTEGER / OBJECT...

Wo leigt der Fehler?
warum kann er die 144 so ohne Weiteres speichern?
In der Referenz steht bei Container:
Code:
GetObject( id, doc, instanceof )
[BaseList2D] GetObject([int] id, [BaseDocument] doc, [[int] instanceof]);

Returns the baselist element pointed to by the link with the specified id, 
if such an element exists. Otherwise it returns NIL. You need to pass the document
to evaluate the link in. Optionally you can pass a type ID in instanceof (e.g. Obase for objects) 
to force the function to only return elements of that type.

Ich übergebe ja sogar zur Sicherheit noch als instanceof das BaseObject.. trotzdem würfelt er da nen Integer raus...
UNLOGISCH?

Hoffe, ihr könnt mir helfen, arbeite seit Tagen an diesem PlugIn und will es auch irgendwann zum laufen bringen....:mad:

Grüße,
Orbit
 
Zuletzt bearbeitet:
Hi!

Urgs, habe leider so schnell kein PlugInTag zum Testen zur Verfügung, deshalb nur mal geraten ;)
Hast Du mal den InstanceOf Parameter der GetLink-Funktion leer gelassen? Oder dort "Obase" verlangt? "BaseDocument" macht doch dort nicht wirklich Sinn, oder?
Und: "OBJECT" ist in Save() tatsächlich vorhanden? Vielleicht auch dort mal ein println(OBJECT->GetName()); zur Sicherheit ausgeben lassen...? ;)

Liebe Grüße,
Mark.
 
Hallo,
Obase akzeptiert er nicht .. warum auch immer (is doch eine konstante die man anwenden kann oder)

Ja, beim Speichern sind alle Objekte vorhanden.... habe ich auch ausgelesen aus dem Container, ist alles da.
mfg,
Orbit
 
Hier mal ein ausführbarer Code der die fehlermeldung genauso auswirft wie in meinem PlugIn..
Eingfach ins pluginverzeichnis und ne datei öffnen, würfel erstellen, tag druff und speuichjern, dann laden...
Code:
const var PLUGIN_ID = 1001230253987437858162341623;
const var PLUGIN_NAME = "Savetester";
const var PLUGIN_VERSION = 1.0;
const var PLUGIN_HELP_TEXT = "test";

class Test:ExpressionPluginTag {
	public:
    	Test();

 	GetID();

  	MultipleAllowed();
  	DisplayAllowed();

  	GetIcon();
	GetHelpText();

        UseMenu();
	GetName();

        Edit();

        Copy(dest);
	Save(hf);
	Load(hf);

        Execute(doc, op);
}

Test::Test(){
	super();
}

Test::GetID(){
	return PLUGIN_ID;
}

Test::MultipleAllowed(){
	return FALSE;
}

Test::DisplayAllowed(){
	return TRUE;
}

Test::GetHelpText(){
	return PLUGIN_HELP_TEXT;
}

Test::UseMenu(){
	return TRUE;
}

Test::GetName(){
	return PLUGIN_NAME;
}

Test::Save(hf){
    var cont = new(BaseContainer, 10);
    cont->SetObject(10, GetObject());
    hf->WriteContainer(cont);
}

Test::Load(hf){
    var cont = hf->ReadContainer();
    var d = cont->GetObject(10, GetActiveDocument());
    println(d->GetName());
}
Test::Execute(doc, op){
	println("Exec");
}
Test::Copy(dest){ dest = this; }
Test::GetIcon(){}

main(){
	Register(Test);
}
 
Zuletzt bearbeitet:
Hi!

Urgs, verzeih, habe leider gerade keine Zeit mehr ... evtl. kann ich mich heute Abend noch mal mit beschäftigen. Somit ein schneller Versuch erst einmal nur hier hin geklatscht... :(

Code:
Test::Save(hf){
    var ct = GetContainer();
    hf->WriteContainer(ct);
}

Test::Load(hf){
    var ct = hf->ReadContainer();
    SetContainer(ct);
}

Test::Execute(doc, op){
    println("Execute");
    var bc    = GetContainer();
    
    var obj = bc->GetObject(10, doc);
    if (obj) println("Objekt geladen: " + obj->GetName());
    else println("Kein Objekt");
    
    if (!obj) {
        obj    = doc->GetFirstObject();
        bc->SetObject(10, obj);
        SetContainer(bc);
        println("Objekt gespeichert: " + obj->GetName());
    }
}
...?

Liebe Grüße,
Mark.
 
Mark, du bist wie immer der Größte!! funktioniert...
Allerdings speichere ich den Container nur einmal und setze ihn immer wieder auf NULL, sodass das auslesen nur beim ersten Execute stattfindet.

Vielen, vielen Dank!!

Komisch, dass COFFEE da gegen seinen Standard verstößt, und statt immer NIL auszugeben scheinbar irgendeinen Integerwert zurückgibt....

Grüße,
Orbit
 
Hi!

Fein, daß es geklappt hat, freut mich! :)

@Speicher: ich kenne es nur mittlerweile von C++: wenn man eine Variable erzeugt, wird Speicher reserviert ... ohne diesen zu löschen. D.h. man sollte immer den Speicher auch "Initialisieren", wenn man keine Zufallswerte erhalten möchte. Vielleicht ist das in diesem Fall der BaseContainer ähnlich -> zunächst immer mit SetObject auf Null setzen?
Bin da aber auch nicht so die Leuchte ;)

Liebe Grüße,
Mark.
 
Zurück