M2Datei.cpp 7.6 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363364365366367368369370371372373374375376377378379380381
  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. {
  10. pfad = new Text();
  11. modelName = new RCArray< Text >();
  12. modelPos = new Array< __int64 >();
  13. ref = 1;
  14. }
  15. M2Datei::M2Datei( const char *pfad )
  16. {
  17. this->pfad = new Text( pfad );
  18. modelName = new RCArray< Text >();
  19. modelPos = new Array< __int64 >();
  20. ref = 1;
  21. }
  22. M2Datei::M2Datei( Text *pfad )
  23. {
  24. this->pfad = pfad;
  25. modelName = new RCArray< Text >();
  26. modelPos = new Array< __int64 >();
  27. ref = 1;
  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. int vAnz = zMdr->polygons->get( p ).vertex->getEintragAnzahl();
  142. char textur = 1;
  143. for( int i = 0; i < vAnz; i++ )
  144. textur = (char)( textur & (char)zMdr->polygons->get( p ).tKordinaten->hat( i ) );
  145. neu.schreibe( &textur, 1 );
  146. neu.schreibe( (char*)&vAnz, 4 );
  147. for( int i = 0; i < vAnz; i++ )
  148. {
  149. float v = zMdr->polygons->get( p ).vertex->get( i ).x;
  150. neu.schreibe( (char*)&v, 4 );
  151. v = zMdr->polygons->get( p ).vertex->get( i ).y;
  152. neu.schreibe( (char*)&v, 4 );
  153. if( textur )
  154. {
  155. int t = zMdr->polygons->get( p ).tKordinaten->get( i ).x;
  156. neu.schreibe( (char*)&t, 4 );
  157. t = zMdr->polygons->get( p ).tKordinaten->get( i ).y;
  158. neu.schreibe( (char*)&t, 4 );
  159. }
  160. }
  161. }
  162. d.remove();
  163. neu.close();
  164. neu.umbenennen( pfad->getText() );
  165. leseDaten();
  166. return 1;
  167. }
  168. bool M2Datei::removeModel( Text *name )
  169. {
  170. bool ret = removeModel( name->getText() );
  171. name->release();
  172. return ret;
  173. }
  174. bool M2Datei::removeModel( const char *name )
  175. {
  176. int anz = modelName->getEintragAnzahl();
  177. int p = -1;
  178. for( int i = 0; i < anz; i++ )
  179. {
  180. if( modelName->z( i )->istGleich( name ) )
  181. {
  182. p = i;
  183. break;
  184. }
  185. }
  186. if( p < 0 )
  187. return 0;
  188. Datei d;
  189. d.setDatei( pfad->getText() );
  190. if( !d.open( Datei::Style::lesen ) )
  191. return 0;
  192. Datei neu;
  193. neu.setDatei( pfad->getText() );
  194. neu.zPfad()->append( "0" );
  195. while( neu.existiert() )
  196. neu.zPfad()->append( "0" );
  197. if( !neu.open( Datei::Style::schreiben ) )
  198. {
  199. if( d.istOffen() )
  200. d.close();
  201. return 0;
  202. }
  203. char nAnz = (char)( anz - 1 );
  204. neu.schreibe( &nAnz, 1 );
  205. int offs = modelName->z( p )->getLength() + 9;
  206. __int64 startP = 0, endP = 0, start2P = 0;
  207. for( int i = 0; i < anz; i++ )
  208. {
  209. char nLen = (char)modelName->z( i )->getLength();
  210. char *n = modelName->z( i )->getText();
  211. __int64 pos = modelPos->get( i );
  212. if( !startP )
  213. startP = pos;
  214. if( i == p + 1 )
  215. start2P = pos;
  216. if( i == p )
  217. {
  218. if( !endP )
  219. endP = pos;
  220. if( i < anz - 1 )
  221. offs += (int)( modelPos->get( i + 1 ) - pos );
  222. }
  223. if( i != p )
  224. {
  225. pos -= offs;
  226. neu.schreibe( &nLen, 1 );
  227. neu.schreibe( n, nLen );
  228. neu.schreibe( (char*)&pos, 8 );
  229. }
  230. }
  231. if( d.istOffen() )
  232. {
  233. d.setLPosition( startP, 0 );
  234. __int64 bLen = endP - startP;
  235. char bytes[ 2048 ];
  236. while( bLen > 0 )
  237. {
  238. int l = 2048 > bLen ? (int)bLen : 2048;
  239. d.lese( bytes, l );
  240. neu.schreibe( bytes, l );
  241. bLen -= l;
  242. }
  243. if( start2P )
  244. {
  245. d.setLPosition( start2P, 0 );
  246. bLen = d.getSize() - start2P;
  247. while( bLen > 0 )
  248. {
  249. int l = 2048 > bLen ? (int)bLen : 2048;
  250. d.lese( bytes, l );
  251. neu.schreibe( bytes, l );
  252. bLen -= l;
  253. }
  254. }
  255. d.close();
  256. }
  257. d.remove();
  258. neu.close();
  259. neu.umbenennen( pfad->getText() );
  260. leseDaten();
  261. return 1;
  262. }
  263. // constant
  264. Model2DData *M2Datei::ladeModel( Text *name ) const
  265. {
  266. Model2DData *ret = ladeModel( name->getText() );
  267. name->release();
  268. return ret;
  269. }
  270. Model2DData *M2Datei::ladeModel( const char *name ) const
  271. {
  272. Datei d;
  273. d.setDatei( pfad->getText() );
  274. if( !d.open( Datei::Style::lesen ) )
  275. return 0;
  276. int anz = modelName->getEintragAnzahl();
  277. for( int i = 0; i < anz; i++ )
  278. {
  279. if( modelName->z( i )->istGleich( name ) )
  280. {
  281. d.setLPosition( modelPos->get( i ), 0 );
  282. break;
  283. }
  284. }
  285. if( !d.getLPosition() )
  286. {
  287. d.close();
  288. return 0;
  289. }
  290. char pAnz = 0;
  291. d.lese( &pAnz, 1 );
  292. Array< Polygon2D > *polygons = new Array< Polygon2D >();
  293. for( int p = 0; p < pAnz; p++ )
  294. {
  295. char textur = 0;
  296. d.lese( &textur, 1 );
  297. int vAnz = 0;
  298. d.lese( (char*)&vAnz, 4 );
  299. if( polygons->hat( p ) )
  300. {
  301. if( polygons->get( p ).vertex )
  302. polygons->get( p ).vertex->release();
  303. if( polygons->get( p ).tKordinaten )
  304. polygons->get( p ).tKordinaten->release();
  305. }
  306. Polygon2D polygon;
  307. polygon.vertex = new Array< Vertex >();
  308. if( textur )
  309. polygon.tKordinaten = new Array< Punkt >();
  310. else
  311. polygon.tKordinaten = 0;
  312. for( int v = 0; v < vAnz; v++ )
  313. {
  314. Vertex p;
  315. d.lese( (char*)&p.x, 4 );
  316. d.lese( (char*)&p.y, 4 );
  317. polygon.vertex->add( p );
  318. if( textur )
  319. {
  320. Punkt tp;
  321. d.lese( (char*)&tp.x, 4 );
  322. d.lese( (char*)&tp.y, 4 );
  323. polygon.tKordinaten->add( tp );
  324. }
  325. }
  326. polygons->add( polygon );
  327. }
  328. d.close();
  329. Model2DData *ret = new Model2DData();
  330. ret->erstelleModell( polygons );
  331. return ret;
  332. }
  333. bool M2Datei::hatModel( const char *name ) const
  334. {
  335. int anz = modelName->getEintragAnzahl();
  336. for( int i = 0; i < anz; i++ )
  337. {
  338. if( modelName->z( i )->istGleich( name ) )
  339. return 1;
  340. }
  341. return 0;
  342. }
  343. int M2Datei::getModelAnzahl() const
  344. {
  345. return modelName->getEintragAnzahl();
  346. }
  347. Text *M2Datei::zModelName( int i ) const
  348. {
  349. return modelName->z( i );
  350. }
  351. // Reference Counting
  352. M2Datei *M2Datei::getThis()
  353. {
  354. ++ref;
  355. return this;
  356. }
  357. M2Datei *M2Datei::release()
  358. {
  359. if( !--ref )
  360. delete this;
  361. return 0;
  362. }