M2Datei.cpp 8.0 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363364365366367368369370371372373374375376377378379380381382383384385386387388389390391
  1. #include "M2Datei.h"
  2. #include "Text.h"
  3. #include "Datei.h"
  4. #include "Model2D.h"
  5. using namespace Framework;
  6. // Inhalt der M2Datei Klasse aus M2Datei.h
  7. // Konstruktor
  8. M2Datei::M2Datei()
  9. : ReferenceCounter()
  10. {
  11. pfad = new Text();
  12. modelName = new RCArray< Text >();
  13. modelPos = new Array< __int64 >();
  14. }
  15. M2Datei::M2Datei(const char* pfad)
  16. : ReferenceCounter()
  17. {
  18. this->pfad = new Text(pfad);
  19. modelName = new RCArray< Text >();
  20. modelPos = new Array< __int64 >();
  21. }
  22. M2Datei::M2Datei(Text* pfad)
  23. : ReferenceCounter()
  24. {
  25. this->pfad = pfad;
  26. modelName = new RCArray< Text >();
  27. modelPos = new Array< __int64 >();
  28. }
  29. // Destruktor
  30. M2Datei::~M2Datei()
  31. {
  32. pfad->release();
  33. modelName->release();
  34. modelPos->release();
  35. }
  36. // nicht constant
  37. void M2Datei::setPfad(const char* pfad)
  38. {
  39. this->pfad->setText(pfad);
  40. }
  41. void M2Datei::setPfadZ(Text* pfad)
  42. {
  43. if (this->pfad)
  44. this->pfad->release();
  45. this->pfad = pfad;
  46. }
  47. void M2Datei::leseDaten()
  48. {
  49. Datei d;
  50. d.setDatei(pfad->getText());
  51. d.open(Datei::Style::lesen);
  52. char anz = 0;
  53. d.lese(&anz, 1);
  54. modelName->leeren();
  55. modelPos->leeren();
  56. for (int i = 0; i < anz; i++)
  57. {
  58. char len = 0;
  59. d.lese(&len, 1);
  60. char* txt = new char[len + 1];
  61. d.lese(txt, len);
  62. txt[(int)len] = 0;
  63. modelName->set(new Text(txt), i);
  64. delete[] txt;
  65. __int64 pos = 0;
  66. d.lese((char*)&pos, 8);
  67. modelPos->set(pos, i);
  68. }
  69. d.close();
  70. }
  71. bool M2Datei::saveModel(Model2DData* zMdr, Text* name)
  72. {
  73. bool ret = saveModel(zMdr, name->getText());
  74. name->release();
  75. return ret;
  76. }
  77. bool M2Datei::saveModel(Model2DData* zMdr, const char* name)
  78. {
  79. int anz = modelName->getEintragAnzahl();
  80. for (int i = 0; i < anz; i++)
  81. {
  82. if (modelName->z(i)->istGleich(name))
  83. {
  84. if (!removeModel(name))
  85. return 0;
  86. break;
  87. }
  88. }
  89. anz = modelName->getEintragAnzahl();
  90. Datei d;
  91. d.setDatei(pfad->getText());
  92. d.open(Datei::Style::lesen);
  93. Datei neu;
  94. neu.setDatei(pfad->getText());
  95. neu.zPfad()->append("0");
  96. while (neu.existiert())
  97. neu.zPfad()->append("0");
  98. if (!neu.open(Datei::Style::schreiben))
  99. {
  100. if (d.istOffen())
  101. d.close();
  102. return 0;
  103. }
  104. modelName->add(new Text(name));
  105. int offs = textLength(name) + 9;
  106. for (int i = 0; i < anz; i++)
  107. modelPos->set(modelPos->get(i) + offs, i);
  108. if (d.getSize() < 0)
  109. modelPos->add(offs + 1);
  110. else
  111. modelPos->add(d.getSize() + offs);
  112. anz++;
  113. char tmp = (char)anz;
  114. neu.schreibe(&tmp, 1);
  115. for (int i = 0; i < anz; i++)
  116. {
  117. char len = (char)modelName->z(i)->getLength();
  118. neu.schreibe(&len, 1);
  119. neu.schreibe(modelName->z(i)->getText(), len);
  120. __int64 pos = modelPos->get(i);
  121. neu.schreibe((char*)&pos, 8);
  122. }
  123. if (d.existiert())
  124. {
  125. d.setLPosition(modelPos->get(0) - offs, 0);
  126. __int64 dl = d.getSize() - d.getLPosition();
  127. char bytes[2048];
  128. while (dl)
  129. {
  130. int l = dl > 2048 ? 2048 : (int)dl;
  131. d.lese(bytes, l);
  132. neu.schreibe(bytes, l);
  133. dl -= l;
  134. }
  135. }
  136. d.close();
  137. char pAnz = (char)zMdr->polygons->getEintragAnzahl();
  138. neu.schreibe(&pAnz, 1);
  139. for (int p = 0; p < pAnz; p++)
  140. {
  141. char pNameL = (char)zMdr->polygons->get(p).name->getLength();
  142. int vAnz = zMdr->polygons->get(p).vertex->getEintragAnzahl();
  143. char options = 1;
  144. for (int i = 0; i < vAnz; i++)
  145. options = (char)(options & (char)zMdr->polygons->get(p).tKordinaten->hat(i));
  146. if (pNameL != 0)
  147. options |= 2;
  148. if (zMdr->polygons->get(p).transparent)
  149. options |= 4;
  150. neu.schreibe(&options, 1);
  151. if ((options | 2) == options) // name
  152. {
  153. neu.schreibe(&pNameL, 1);
  154. neu.schreibe(zMdr->polygons->get(p).name->getText(), pNameL);
  155. }
  156. neu.schreibe((char*)&vAnz, 4);
  157. for (int i = 0; i < vAnz; i++)
  158. {
  159. float v = zMdr->polygons->get(p).vertex->get(i).x;
  160. neu.schreibe((char*)&v, 4);
  161. v = zMdr->polygons->get(p).vertex->get(i).y;
  162. neu.schreibe((char*)&v, 4);
  163. if ((options | 1) == options) // textur
  164. {
  165. float t = zMdr->polygons->get(p).tKordinaten->get(i).x;
  166. neu.schreibe((char*)&t, 4);
  167. t = zMdr->polygons->get(p).tKordinaten->get(i).y;
  168. neu.schreibe((char*)&t, 4);
  169. }
  170. }
  171. }
  172. d.remove();
  173. neu.close();
  174. neu.umbenennen(pfad->getText());
  175. leseDaten();
  176. return 1;
  177. }
  178. bool M2Datei::removeModel(Text* name)
  179. {
  180. bool ret = removeModel(name->getText());
  181. name->release();
  182. return ret;
  183. }
  184. bool M2Datei::removeModel(const char* name)
  185. {
  186. int anz = modelName->getEintragAnzahl();
  187. int p = -1;
  188. for (int i = 0; i < anz; i++)
  189. {
  190. if (modelName->z(i)->istGleich(name))
  191. {
  192. p = i;
  193. break;
  194. }
  195. }
  196. if (p < 0)
  197. return 0;
  198. Datei d;
  199. d.setDatei(pfad->getText());
  200. if (!d.open(Datei::Style::lesen))
  201. return 0;
  202. Datei neu;
  203. neu.setDatei(pfad->getText());
  204. neu.zPfad()->append("0");
  205. while (neu.existiert())
  206. neu.zPfad()->append("0");
  207. if (!neu.open(Datei::Style::schreiben))
  208. {
  209. if (d.istOffen())
  210. d.close();
  211. return 0;
  212. }
  213. char nAnz = (char)(anz - 1);
  214. neu.schreibe(&nAnz, 1);
  215. int offs = modelName->z(p)->getLength() + 9;
  216. __int64 startP = 0, endP = 0, start2P = 0;
  217. for (int i = 0; i < anz; i++)
  218. {
  219. char nLen = (char)modelName->z(i)->getLength();
  220. const char* n = modelName->z(i)->getText();
  221. __int64 pos = modelPos->get(i);
  222. if (!startP)
  223. startP = pos;
  224. if (i == p + 1)
  225. start2P = pos;
  226. if (i == p)
  227. {
  228. if (!endP)
  229. endP = pos;
  230. if (i < anz - 1)
  231. offs += (int)(modelPos->get(i + 1) - pos);
  232. }
  233. if (i != p)
  234. {
  235. pos -= offs;
  236. neu.schreibe(&nLen, 1);
  237. neu.schreibe(n, nLen);
  238. neu.schreibe((char*)&pos, 8);
  239. }
  240. }
  241. if (d.istOffen())
  242. {
  243. d.setLPosition(startP, 0);
  244. __int64 bLen = endP - startP;
  245. char bytes[2048];
  246. while (bLen > 0)
  247. {
  248. int l = 2048 > bLen ? (int)bLen : 2048;
  249. d.lese(bytes, l);
  250. neu.schreibe(bytes, l);
  251. bLen -= l;
  252. }
  253. if (start2P)
  254. {
  255. d.setLPosition(start2P, 0);
  256. bLen = d.getSize() - start2P;
  257. while (bLen > 0)
  258. {
  259. int l = 2048 > bLen ? (int)bLen : 2048;
  260. d.lese(bytes, l);
  261. neu.schreibe(bytes, l);
  262. bLen -= l;
  263. }
  264. }
  265. d.close();
  266. }
  267. d.remove();
  268. neu.close();
  269. neu.umbenennen(pfad->getText());
  270. leseDaten();
  271. return 1;
  272. }
  273. // constant
  274. Model2DData* M2Datei::ladeModel(Text* name) const
  275. {
  276. Model2DData* ret = ladeModel(name->getText());
  277. name->release();
  278. return ret;
  279. }
  280. Model2DData* M2Datei::ladeModel(const char* name) const
  281. {
  282. Datei d;
  283. d.setDatei(pfad->getText());
  284. if (!d.open(Datei::Style::lesen))
  285. return 0;
  286. int anz = modelName->getEintragAnzahl();
  287. for (int i = 0; i < anz; i++)
  288. {
  289. if (modelName->z(i)->istGleich(name))
  290. {
  291. d.setLPosition(modelPos->get(i), 0);
  292. break;
  293. }
  294. }
  295. if (!d.getLPosition())
  296. {
  297. d.close();
  298. return 0;
  299. }
  300. char pAnz = 0;
  301. d.lese(&pAnz, 1);
  302. Array< Polygon2D >* polygons = new Array< Polygon2D >();
  303. for (int p = 0; p < pAnz; p++)
  304. {
  305. char options = 0;
  306. d.lese(&options, 1);
  307. Polygon2D polygon;
  308. polygon.schwerpunkt = new Vertex(0, 0);
  309. polygon.transparent = (options | 4) == options;
  310. polygon.name = new Text();
  311. if ((options | 2) == options)
  312. {
  313. char nameL = 0;
  314. d.lese(&nameL, 1);
  315. char* name = new char[nameL + 1];
  316. name[(int)nameL] = 0;
  317. d.lese(name, nameL);
  318. polygon.name->setText(name);
  319. delete[] name;
  320. }
  321. int vAnz = 0;
  322. d.lese((char*)&vAnz, 4);
  323. if (polygons->hat(p))
  324. {
  325. if (polygons->get(p).vertex)
  326. polygons->get(p).vertex->release();
  327. if (polygons->get(p).tKordinaten)
  328. polygons->get(p).tKordinaten->release();
  329. }
  330. polygon.vertex = new Array< Vertex >();
  331. if ((options | 1) == options) // wenn textur
  332. polygon.tKordinaten = new Array< Vertex >();
  333. else
  334. polygon.tKordinaten = 0;
  335. for (int v = 0; v < vAnz; v++)
  336. {
  337. Vertex p;
  338. d.lese((char*)&p.x, 4);
  339. d.lese((char*)&p.y, 4);
  340. *polygon.schwerpunkt += p * (float)(1.0 / vAnz);
  341. polygon.vertex->add(p);
  342. if ((options | 1) == options) // wenn textur
  343. {
  344. Vertex tp;
  345. d.lese((char*)&tp.x, 4);
  346. d.lese((char*)&tp.y, 4);
  347. polygon.tKordinaten->add(tp);
  348. }
  349. }
  350. polygons->add(polygon);
  351. }
  352. d.close();
  353. Model2DData* ret = new Model2DData();
  354. ret->erstelleModell(polygons);
  355. return ret;
  356. }
  357. bool M2Datei::hatModel(const char* name) const
  358. {
  359. int anz = modelName->getEintragAnzahl();
  360. for (int i = 0; i < anz; i++)
  361. {
  362. if (modelName->z(i)->istGleich(name))
  363. return 1;
  364. }
  365. return 0;
  366. }
  367. int M2Datei::getModelAnzahl() const
  368. {
  369. return modelName->getEintragAnzahl();
  370. }
  371. Text* M2Datei::zModelName(int i) const
  372. {
  373. return modelName->z(i);
  374. }