M2Datei.cpp 10 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. 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. }