Your browser does not seem to support JavaScript. As a result, your viewing experience will be diminished, and you have been placed in read-only mode.
Please download a browser that supports JavaScript, or enable it if it's disabled (i.e. NoScript).
THE POST BELOW IS MORE THAN 5 YEARS OLD. RELATED SUPPORT INFORMATION MIGHT BE OUTDATED OR DEPRECATED
On 11/08/2006 at 10:42, xxxxxxxx wrote:
User Information: Cinema 4D Version: 9.603 Platform: Windows ; Language(s) : C++ ;
--------- Hi all
i try to make a copy paste system for polygons. And i'm having some stability problems.
Here is the code of the "copy" part. Sorry, i couln't simplify it anymore so that it still crashes.
#include "c4d.h" #include "c4d_symbols.h" struct Clipboard { ~Clipboard() { TakeObjects(NULL); } AutoAlloc<AtomArray> array; void TakeObjects( AtomArray* a ); }; void Clipboard::TakeObjects( AtomArray* a ) { if( !array ) return; // free all stored objects array->FilterObjectChildren(); for( LONG i=0; i<array->GetCount(); ++i ) { BaseObject* op = static_cast<BaseObject*>( array->GetIndex(i) ); BaseObject::Free( op ); } array->Flush(); GeAssert( array->GetCount()==0 ); // copy pointers from a to array if( a ) a->CopyTo( array ); } static Clipboard *g_clip = NULL; void FreeClipboard() { gDelete( g_clip ); } Clipboard* GetClipboard() { if( !g_clip ) { g_clip = gNew Clipboard; } return g_clip; } Bool DoCopy( BaseDocument* doc ) { Clipboard* clip = GetClipboard(); if( !clip ) return TRUE; AutoAlloc<AtomArray> active; doc->GetActivePolygonObjects( *active, TRUE ); if( active->GetCount()>0 ) { ModelingCommandData md; md.op = NULL; md.arr = active; md.doc = doc; md.result = NULL; md.mode = 0; md.flags = 0; md.result = NULL; SendModelingCommand( MCOMMAND_SPLIT, md ); clip->TakeObjects( md.result ); } else clip->TakeObjects( NULL ); return TRUE; } class MenuTest : public CommandData { public: virtual Bool Execute(BaseDocument *doc); }; Bool MenuTest::Execute(BaseDocument *doc) { DoCopy( doc ); return TRUE; } Bool RegisterMenuTest(void) { // decide by name if the plugin shall be registered - just for user convenience String name=GeLoadString(IDS_MENUTEST); if (!name.Content()) return TRUE; // be sure to use a unique ID obtained from www.plugincafe.com return RegisterCommandPlugin(1000956,name,0,"icon.tif","C++ SDK Menu Test Plugin",gNew MenuTest); } //In main.cpp: void FreeClipboard(); void PluginEnd(void) { FreeClipboard(); }
This code can crash reproducable when you do the following:
Create c4d_debug.txt file, so C4d runns in debug mode. Run C4d. Make a cube. Make Editable. Make a HNWeightTag ( use hn weight tool on some edges ) Select some polys Call the plug Quite Cinema ... BOOM... wtf..
it only crashes if you run in debug mode, and have the HN tag. I suspect some memory becomes corrupted somehow.
Okay this crash happens when you quit. But i'm also having other crashes which are harder to reproduce.
I have no idea what is going on. Help ??!!
On 11/08/2006 at 12:31, xxxxxxxx wrote:
hmm... if i use this...
void Clipboard::TakeObjects( AtomArray* a ) { if( !array ) return; array->FilterObjectChildren(); for( LONG i=0; i<array->GetCount(); ++i ) { BaseObject* op = static_cast<BaseObject*>( array->GetIndex(i) ); BaseObject::Free( op ); } array->Flush(); GeAssert( array->GetCount()==0 ); if( a ) a->CopyTo( array ); for( LONG i=0; i<array->GetCount(); ++i ) { BaseObject* op = static_cast<BaseObject*>( array->GetIndex(i) ); BaseTag *t; while( t = op->GetTag( Tsds ) ) { t->Remove(); BaseTag::Free( t ); } } }
... the entire plug appears to work just fine.
best regards Michael
On 17/08/2006 at 23:59, xxxxxxxx wrote:
bump
uhm.. mikael, can you reproduce ?
On 18/08/2006 at 14:05, xxxxxxxx wrote:
Sorry, I thought that the last piece of code you posted was a fix. Perhaps I should take the time to actually read this thread through now...
On 19/08/2006 at 10:21, xxxxxxxx wrote:
Yes please check it out. The code is no fix, it removes the HNWeight-Tags which seem to cause the problems. It should work with all kind of tags though.
Thanks
On 28/08/2006 at 01:31, xxxxxxxx wrote:
You should use:
C4DPL_ENDACTIVITY
in PluginMessage otherwise (from the sdk docs) :
Sent to all plugins before any PluginEnd() has been called. This allows you to close dialogs, end threads, delete temporary/undo buffers etc. In PluginEnd() it might crash as some resources from other plugins might already be freed.
HTH.
On 28/08/2006 at 02:53, xxxxxxxx wrote:
Thanks David.