M2Datei.cpp 9.9 KB

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