Changeset 2023 for lang/ruby

Show
Ignore:
Timestamp:
11/26/07 16:09:01 (6 years ago)
Author:
gyuque
Message:

lang/ruby/RubyESRIShape: Point object

Location:
lang/ruby/RubyESRIShape
Files:
4 modified

Legend:

Unmodified
Added
Removed
  • lang/ruby/RubyESRIShape/RubyESRIShape.c

    r2015 r2023  
    1818#ifndef RUBYESRISHAPE_TEST 
    1919 
    20 typedef struct _RShapeData 
    21 { 
    22         void* pThis; 
    23 } RShapeData; 
    24  
    2520static VALUE rb_shape_allocate(VALUE klass); 
    2621static void  rb_shape_free(void *ptr); 
     
    3025static void  rb_polygon_free(void *ptr); 
    3126static void  rb_polygon_mark(void *ptr); 
     27 
     28static void  rb_point_free(void *ptr); 
    3229 
    3330// Shape 
     
    172169        return self; 
    173170} 
     171 
     172// Point 
     173 
     174static VALUE rb_point_allocate(VALUE klass) 
     175{ 
     176        RPointData* indata = ALLOC(RPointData); 
     177        indata->pThis = NULL; 
     178 
     179        return Data_Wrap_Struct(klass, 0, rb_point_free, indata); 
     180} 
     181 
     182static void rb_point_free(void *ptr) 
     183{ 
     184        if (ptr) 
     185        { 
     186                if (((RPointData*)ptr)->pThis) 
     187                        c_Point_delete(((RPointData*)ptr)->pThis); 
     188                free(ptr); 
     189        } 
     190} 
     191 
    174192 
    175193void Init_RubyESRIShape() 
     
    198216        // class 
    199217        rb_cPoint = rb_define_class_under (rb_mRubyESRIShape, "Point", rb_cObject); 
     218        rb_define_alloc_func(rb_cPoint, rb_point_allocate); 
    200219 
    201220} 
  • lang/ruby/RubyESRIShape/Shape.cpp

    r2015 r2023  
    66 
    77extern "C" VALUE getRubyESRIShapePolygonClass(); 
     8extern "C" VALUE getRubyESRIShapePointClass(); 
    89 
    910Shape::Shape(void) 
     
    1617{ 
    1718        clearBaseName(); 
     19        clearRecords(); 
    1820} 
    1921 
     
    8789es_error_t Shape::readMainFileRecords(FILE* fp, ShpReadContext& rctx) 
    8890{ 
    89         mRORecords.clear(); 
     91        clearRecords(); 
    9092 
    9193        int recidx; 
     
    103105                if (content) 
    104106                { 
    105                         VALUE ro = content->toRubyObject(); 
    106                         mRORecords.push_back(ro); 
     107                        mRecords.push_back(content); 
    107108                } 
    108109 
     
    176177VALUE Shape::getRecordAt(int index) 
    177178{ 
    178         if (index < 1 || index > mRORecords.size()) 
     179        if (index < 1 || index > mRecords.size()) 
    179180                return Qnil; 
    180181 
    181         return mRORecords[index-1]; 
     182        return mRecords[index-1]->clone()->toRubyObject(); 
    182183} 
    183184 
    184185int Shape::getLength() const 
    185186{ 
    186         return mRORecords.size(); 
     187        return mRecords.size(); 
    187188} 
    188189 
    189190void Shape::markRubyGC() 
    190191{ 
    191         RValueList::iterator it; 
    192         for (it = mRORecords.begin();it != mRORecords.end();it++) 
    193                 rb_gc_mark(*it); 
     192} 
     193 
     194void Shape::clearRecords() 
     195{ 
     196        RecordContentList::iterator it; 
     197        for (it = mRecords.begin();it != mRecords.end();it++) 
     198                delete *it; 
     199 
     200        mRecords.clear(); 
    194201} 
    195202 
     
    329336        len -= mPartIndexes[index]; 
    330337 
     338        int start = mPartIndexes[index]; 
     339 
    331340        VALUE arr = rb_ary_new2(len); 
    332341        for (int i = 0;i < len;i++) 
    333                 rb_ary_push(arr, INT2FIX(9 /*dmy*/ )); 
     342        { 
     343                ESPointEx& p = mPoints[start+i]; 
     344                ShpPoint* shp = new ShpPoint(p.x, p.y, p.z, p.m); 
     345                rb_ary_push(arr, shp->toRubyObject()); 
     346 
     347                rb_ary_push(arr, INT2FIX(1)); 
     348        } 
    334349 
    335350        return arr; 
     
    341356} 
    342357 
    343  
     358ShpRecordObject* ShpPolygon::clone() 
     359{ 
     360        ShpPolygon* copy = new ShpPolygon(mOption); 
     361        copy->mType = mType; 
     362        copy->mNParts = mNParts; 
     363        copy->mNPoints = mNPoints; 
     364 
     365        copy->allocBuffers(); 
     366        memcpy(copy->mPoints     , mPoints     , sizeof(ESPointEx) * mNPoints); 
     367        memcpy(copy->mPartIndexes, mPartIndexes, sizeof(ESInt32  ) * mNParts); 
     368        memcpy(copy->mBounds     , mBounds     , sizeof(ESDouble ) * 4); 
     369 
     370        copy->mZRange[0] = mZRange[0]; 
     371        copy->mZRange[1] = mZRange[1]; 
     372 
     373        copy->mMRange[0] = mMRange[0]; 
     374        copy->mMRange[1] = mMRange[1]; 
     375 
     376 
     377        return copy; 
     378} 
     379 
     380// Point 
     381 
     382ShpPoint::ShpPoint(ESDouble x, ESDouble y, ESDouble z, ESDouble m) 
     383{ 
     384        mX = x; 
     385        mY = y; 
     386        mZ = z; 
     387        mM = m; 
     388} 
     389 
     390ShpPoint::~ShpPoint() 
     391{ 
     392} 
     393 
     394VALUE ShpPoint::toRubyObject() 
     395{ 
     396        VALUE klass = getRubyESRIShapePointClass(); 
     397        VALUE instance = rb_class_new_instance(0, NULL, klass); 
     398 
     399        RPointData* indata; 
     400        Data_Get_Struct(instance, RPointData, indata); 
     401 
     402        indata->pThis = this; 
     403 
     404        return instance; 
     405} 
     406 
     407ShpRecordObject* ShpPoint::clone() 
     408{ 
     409        ShpPoint* copy = new ShpPoint(mX, mY, mZ, mM); 
     410        return copy; 
     411} 
    344412 
    345413void* c_Shape_new() 
     
    372440int c_Polygon_getPartsLength(void* pThis) 
    373441{return ((ShpPolygon*)pThis)->getPartsLength();} 
     442 
     443void  c_Point_delete(void* pThis) 
     444{delete (ShpPoint*)pThis;} 
  • lang/ruby/RubyESRIShape/Shape.h

    r2015 r2023  
    8686        static ESDouble freadLittleDouble(FILE* fp); 
    8787private: 
     88        void clearRecords(); 
    8889 
    8990        void clearBaseName(); 
     
    9697        SHPFileHeader mSHPFHeader; 
    9798 
    98         RValueList mRORecords; 
     99        RecordContentList mRecords; 
    99100}; 
    100101 
     
    104105#endif // __cplusplus 
    105106 
    106 typedef struct _RPolygonData 
     107struct _RubyCPPObject 
    107108{ 
    108109        void* pThis; 
    109 } RPolygonData; 
     110}; 
     111 
     112typedef struct _RubyCPPObject RPolygonData; 
     113typedef struct _RubyCPPObject RPointData; 
     114typedef struct _RubyCPPObject RShapeData; 
    110115 
    111116void* c_Shape_new(); 
     
    122127int   c_Polygon_getPartsLength(void* pThis); 
    123128 
     129void  c_Point_delete(void* pThis); 
     130 
    124131#ifdef __cplusplus 
    125132} 
  • lang/ruby/RubyESRIShape/Shape_int.h

    r2015 r2023  
    55 
    66#include <vector> 
    7 typedef std::vector<VALUE> RValueList; 
    87 
    98typedef struct _ShpReadContext { 
     
    1817        virtual ~ShpRecordObject(){}; 
    1918        virtual VALUE toRubyObject() = 0; 
     19        virtual ShpRecordObject* clone() = 0; 
    2020}; 
     21 
     22typedef std::vector<ShpRecordObject*> RecordContentList; 
    2123 
    2224#define SHPPOLYGON_Z 0x1 
     
    2931        virtual ~ShpPolygon(); 
    3032        virtual VALUE toRubyObject(); 
     33        virtual ShpRecordObject* clone(); 
     34 
    3135        VALUE getPartAt(int index); 
    3236        int getPartsLength(); 
     
    5660{ 
    5761public: 
    58         ShpPoint(); 
     62        ShpPoint(ESDouble x, ESDouble y, ESDouble z, ESDouble m); 
    5963        virtual ~ShpPoint(); 
    6064        virtual VALUE toRubyObject(); 
     65        virtual ShpRecordObject* clone(); 
     66 
     67        ESDouble getX() const{ return mX; } 
     68        ESDouble getY() const{ return mY; } 
     69        ESDouble getZ() const{ return mZ; } 
     70        ESDouble getM() const{ return mM; } 
     71private: 
     72        ESDouble mX; 
     73        ESDouble mY; 
     74        ESDouble mZ; 
     75        ESDouble mM; 
    6176}; 
    6277