123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363364365366367368369370371372373374375376377378379 |
- #include "M2Datei.h"
- #include "Datei.h"
- #include "Model2D.h"
- #include "Text.h"
- using namespace Framework;
- // Inhalt der M2Datei Klasse aus M2Datei.h
- // Konstruktor
- M2Datei::M2Datei()
- : ReferenceCounter()
- {
- pfad = new Text();
- modelName = new RCArray<Text>();
- modelPos = new Array<__int64>();
- }
- M2Datei::M2Datei(const char* pfad)
- : ReferenceCounter()
- {
- this->pfad = new Text(pfad);
- modelName = new RCArray<Text>();
- modelPos = new Array<__int64>();
- }
- M2Datei::M2Datei(Text* pfad)
- : ReferenceCounter()
- {
- this->pfad = pfad;
- modelName = new RCArray<Text>();
- modelPos = new Array<__int64>();
- }
- // Destruktor
- M2Datei::~M2Datei()
- {
- pfad->release();
- modelName->release();
- modelPos->release();
- }
- // nicht constant
- void M2Datei::setPfad(const char* pfad)
- {
- this->pfad->setText(pfad);
- }
- void M2Datei::setPfadZ(Text* pfad)
- {
- if (this->pfad) this->pfad->release();
- this->pfad = pfad;
- }
- void M2Datei::leseDaten()
- {
- Datei d;
- d.setDatei(pfad->getText());
- d.open(Datei::Style::lesen);
- char anz = 0;
- d.lese(&anz, 1);
- modelName->leeren();
- modelPos->leeren();
- for (int i = 0; i < anz; i++)
- {
- char len = 0;
- d.lese(&len, 1);
- char* txt = new char[len + 1];
- d.lese(txt, len);
- txt[(int)len] = 0;
- modelName->set(new Text(txt), i);
- delete[] txt;
- __int64 pos = 0;
- d.lese((char*)&pos, 8);
- modelPos->set(pos, i);
- }
- d.close();
- }
- bool M2Datei::saveModel(Model2DData* zMdr, Text* name)
- {
- bool ret = saveModel(zMdr, name->getText());
- name->release();
- return ret;
- }
- bool M2Datei::saveModel(Model2DData* zMdr, const char* name)
- {
- int anz = modelName->getEintragAnzahl();
- for (int i = 0; i < anz; i++)
- {
- if (modelName->z(i)->istGleich(name))
- {
- if (!removeModel(name)) return 0;
- break;
- }
- }
- anz = modelName->getEintragAnzahl();
- Datei d;
- d.setDatei(pfad->getText());
- d.open(Datei::Style::lesen);
- Datei neu;
- neu.setDatei(pfad->getText());
- neu.zPfad()->append("0");
- while (neu.existiert())
- neu.zPfad()->append("0");
- if (!neu.open(Datei::Style::schreiben))
- {
- if (d.istOffen()) d.close();
- return 0;
- }
- modelName->add(new Text(name));
- int offs = textLength(name) + 9;
- for (int i = 0; i < anz; i++)
- modelPos->set(modelPos->get(i) + offs, i);
- if (d.getSize() < 0)
- modelPos->add(offs + 1);
- else
- modelPos->add(d.getSize() + offs);
- anz++;
- char tmp = (char)anz;
- neu.schreibe(&tmp, 1);
- for (int i = 0; i < anz; i++)
- {
- char len = (char)modelName->z(i)->getLength();
- neu.schreibe(&len, 1);
- neu.schreibe(modelName->z(i)->getText(), len);
- __int64 pos = modelPos->get(i);
- neu.schreibe((char*)&pos, 8);
- }
- if (d.existiert())
- {
- d.setLPosition(modelPos->get(0) - offs, 0);
- __int64 dl = d.getSize() - d.getLPosition();
- char bytes[2048];
- while (dl)
- {
- int l = dl > 2048 ? 2048 : (int)dl;
- d.lese(bytes, l);
- neu.schreibe(bytes, l);
- dl -= l;
- }
- }
- d.close();
- char pAnz = (char)zMdr->polygons->getEintragAnzahl();
- neu.schreibe(&pAnz, 1);
- for (int p = 0; p < pAnz; p++)
- {
- char pNameL = (char)zMdr->polygons->get(p).name->getLength();
- int vAnz = zMdr->polygons->get(p).vertex->getEintragAnzahl();
- char options = 1;
- for (int i = 0; i < vAnz; i++)
- options
- = (char)(options
- & (char)zMdr->polygons->get(p).tKordinaten->hat(i));
- if (pNameL != 0) options |= 2;
- if (zMdr->polygons->get(p).transparent) options |= 4;
- neu.schreibe(&options, 1);
- if ((options | 2) == options) // name
- {
- neu.schreibe(&pNameL, 1);
- neu.schreibe(zMdr->polygons->get(p).name->getText(), pNameL);
- }
- neu.schreibe((char*)&vAnz, 4);
- for (int i = 0; i < vAnz; i++)
- {
- float v = zMdr->polygons->get(p).vertex->get(i).x;
- neu.schreibe((char*)&v, 4);
- v = zMdr->polygons->get(p).vertex->get(i).y;
- neu.schreibe((char*)&v, 4);
- if ((options | 1) == options) // textur
- {
- float t = zMdr->polygons->get(p).tKordinaten->get(i).x;
- neu.schreibe((char*)&t, 4);
- t = zMdr->polygons->get(p).tKordinaten->get(i).y;
- neu.schreibe((char*)&t, 4);
- }
- }
- }
- d.remove();
- neu.close();
- neu.umbenennen(pfad->getText());
- leseDaten();
- return 1;
- }
- bool M2Datei::removeModel(Text* name)
- {
- bool ret = removeModel(name->getText());
- name->release();
- return ret;
- }
- bool M2Datei::removeModel(const char* name)
- {
- int anz = modelName->getEintragAnzahl();
- int p = -1;
- for (int i = 0; i < anz; i++)
- {
- if (modelName->z(i)->istGleich(name))
- {
- p = i;
- break;
- }
- }
- if (p < 0) return 0;
- Datei d;
- d.setDatei(pfad->getText());
- if (!d.open(Datei::Style::lesen)) return 0;
- Datei neu;
- neu.setDatei(pfad->getText());
- neu.zPfad()->append("0");
- while (neu.existiert())
- neu.zPfad()->append("0");
- if (!neu.open(Datei::Style::schreiben))
- {
- if (d.istOffen()) d.close();
- return 0;
- }
- char nAnz = (char)(anz - 1);
- neu.schreibe(&nAnz, 1);
- int offs = modelName->z(p)->getLength() + 9;
- __int64 startP = 0, endP = 0, start2P = 0;
- for (int i = 0; i < anz; i++)
- {
- char nLen = (char)modelName->z(i)->getLength();
- const char* n = modelName->z(i)->getText();
- __int64 pos = modelPos->get(i);
- if (!startP) startP = pos;
- if (i == p + 1) start2P = pos;
- if (i == p)
- {
- if (!endP) endP = pos;
- if (i < anz - 1) offs += (int)(modelPos->get(i + 1) - pos);
- }
- if (i != p)
- {
- pos -= offs;
- neu.schreibe(&nLen, 1);
- neu.schreibe(n, nLen);
- neu.schreibe((char*)&pos, 8);
- }
- }
- if (d.istOffen())
- {
- d.setLPosition(startP, 0);
- __int64 bLen = endP - startP;
- char bytes[2048];
- while (bLen > 0)
- {
- int l = 2048 > bLen ? (int)bLen : 2048;
- d.lese(bytes, l);
- neu.schreibe(bytes, l);
- bLen -= l;
- }
- if (start2P)
- {
- d.setLPosition(start2P, 0);
- bLen = d.getSize() - start2P;
- while (bLen > 0)
- {
- int l = 2048 > bLen ? (int)bLen : 2048;
- d.lese(bytes, l);
- neu.schreibe(bytes, l);
- bLen -= l;
- }
- }
- d.close();
- }
- d.remove();
- neu.close();
- neu.umbenennen(pfad->getText());
- leseDaten();
- return 1;
- }
- // constant
- Model2DData* M2Datei::ladeModel(Text* name) const
- {
- Model2DData* ret = ladeModel(name->getText());
- name->release();
- return ret;
- }
- Model2DData* M2Datei::ladeModel(const char* name) const
- {
- Datei d;
- d.setDatei(pfad->getText());
- if (!d.open(Datei::Style::lesen)) return 0;
- int anz = modelName->getEintragAnzahl();
- for (int i = 0; i < anz; i++)
- {
- if (modelName->z(i)->istGleich(name))
- {
- d.setLPosition(modelPos->get(i), 0);
- break;
- }
- }
- if (!d.getLPosition())
- {
- d.close();
- return 0;
- }
- char pAnz = 0;
- d.lese(&pAnz, 1);
- Array<Polygon2D>* polygons = new Array<Polygon2D>();
- for (int p = 0; p < pAnz; p++)
- {
- char options = 0;
- d.lese(&options, 1);
- Polygon2D polygon;
- polygon.schwerpunkt = new Vertex(0, 0);
- polygon.transparent = (options | 4) == options;
- polygon.name = new Text();
- if ((options | 2) == options)
- {
- char nameL = 0;
- d.lese(&nameL, 1);
- char* name = new char[nameL + 1];
- name[(int)nameL] = 0;
- d.lese(name, nameL);
- polygon.name->setText(name);
- delete[] name;
- }
- int vAnz = 0;
- d.lese((char*)&vAnz, 4);
- if (polygons->hat(p))
- {
- if (polygons->get(p).vertex) polygons->get(p).vertex->release();
- if (polygons->get(p).tKordinaten)
- polygons->get(p).tKordinaten->release();
- }
- polygon.vertex = new Array<Vertex>();
- if ((options | 1) == options) // wenn textur
- polygon.tKordinaten = new Array<Vertex>();
- else
- polygon.tKordinaten = 0;
- for (int v = 0; v < vAnz; v++)
- {
- Vertex p;
- d.lese((char*)&p.x, 4);
- d.lese((char*)&p.y, 4);
- *polygon.schwerpunkt += p * (float)(1.0 / vAnz);
- polygon.vertex->add(p);
- if ((options | 1) == options) // wenn textur
- {
- Vertex tp;
- d.lese((char*)&tp.x, 4);
- d.lese((char*)&tp.y, 4);
- polygon.tKordinaten->add(tp);
- }
- }
- polygons->add(polygon);
- }
- d.close();
- Model2DData* ret = new Model2DData();
- ret->erstelleModell(polygons);
- return ret;
- }
- bool M2Datei::hatModel(const char* name) const
- {
- int anz = modelName->getEintragAnzahl();
- for (int i = 0; i < anz; i++)
- {
- if (modelName->z(i)->istGleich(name)) return 1;
- }
- return 0;
- }
- int M2Datei::getModelAnzahl() const
- {
- return modelName->getEintragAnzahl();
- }
- Text* M2Datei::zModelName(int i) const
- {
- return modelName->z(i);
- }
|