Modeling Question.

THE POST BELOW IS MORE THAN 5 YEARS OLD. RELATED SUPPORT INFORMATION MIGHT BE OUTDATED OR DEPRECATED

On 23/09/2010 at 15:25, xxxxxxxx wrote:

User Information:
Cinema 4D Version:   12 
Platform:   Windows  ;   
Language(s) :     C++  ;

---------
Hey everyone.   I am trying to do some edge cuts on an object.  I am using the following code to do so...   The problem is when I leave the labeled piece of code in the code, the plugin crashes.  When I comment it out, it works fine but thge edge cuts do not work right.  I am sure that the cuts are not working right because I am making cuts on edges that have already been cut.

Any thoughts on why the code labeled "<-- THIS CODE CAUSES THE CRASH" is causing c4d to crash?

Thanks,

Shawn

  
  
BaseDocument *doc = mdat.doc;  
 BaseObject *op = doc->GetActiveObject();  
 BaseContainer *bc = mdat.bc;  
  
 PolygonObject *objPoly = (PolygonObject * )op;  
 if(!objPoly) return FALSE;  
   
  AutoAlloc<Modeling> mod;  
  if (!mod || !mod->InitObject(objPoly)) return FALSE;  
  
  LONG pointCount = objPoly->GetPointCount();  
  LONG polyCount    = objPoly->GetPolygonCount();  
  
  CPolygon * polys = objPoly->GetPolygonW();  
  Real width = bc->GetReal(CHAMFER_WIDTH);  
  
  PolyInfo *pli  = NULL;  
  Neighbor n;  
  
  LONG pointA = 0, pointB = 0;  
  //Iterate Through Edges  
  for ( int i=0; i < polyCount; i++)  
  {  
      pli = n.GetPolyInfo(i);  
  
      for (int side = 0; side < 4; side++) // test all 4 sides of a polygon  
      {  
          // only proceed if edge has not already been processed  
          // and edge really exists (for triangles side 2 from c..d does not exist as c==d)  
          if (pli->mark[side] || side==2 && polys[i].c == polys[i].d) continue;    <--  THIS CODE IS CAUSING THE CRASH  
  
          switch (side)  
          {  
                
              case 0: pointA = polys[i].a; pointB = polys[i].d; break;  
              case 1: pointA = polys[i].d; pointB = polys[i].c; break;  
                
              case 2: pointA = polys[i].c; pointB = polys[i].b; break;  
              case 3: pointA = polys[i].b; pointB = polys[i].a; break;  
                        
          }  
  
          //Split Edges  
          mod->SplitEdge(objPoly, pointA, pointB, width);  
          EventAdd();  
    
      }  
  }  
  
  //Delete Original Points  
  for (int i=0; i < pointCount; i++)  
  {  
  
      mod->DeletePoint(objPoly, i);  
  }  
    
  
  if (!mod->Commit()) return FALSE;  
    
  EventAdd();  
    
  return TRUE;   
  

THE POST BELOW IS MORE THAN 5 YEARS OLD. RELATED SUPPORT INFORMATION MIGHT BE OUTDATED OR DEPRECATED

On 24/09/2010 at 02:10, xxxxxxxx wrote:

maybe pli is not available?

btw, dont you need some brackets like

if (pli->mark[side] || (side==2 && (polys _.c == polys _.d)))

just a thought

THE POST BELOW IS MORE THAN 5 YEARS OLD. RELATED SUPPORT INFORMATION MIGHT BE OUTDATED OR DEPRECATED

On 24/09/2010 at 13:17, xxxxxxxx wrote:

Originally posted by xxxxxxxx

maybe pli is not available?

_

Well you are right about that.  Because like an idiot I forgot to put ...

  
if (!pli) return FALSE;  

...now my question is why wouldn't pli be available?  Am I using the Neighbor class wrong?

Any thoughts?

Thanks,

~Shawn
_

THE POST BELOW IS MORE THAN 5 YEARS OLD. RELATED SUPPORT INFORMATION MIGHT BE OUTDATED OR DEPRECATED

On 25/09/2010 at 10:35, xxxxxxxx wrote:

Any ideas about this?

THE POST BELOW IS MORE THAN 5 YEARS OLD. RELATED SUPPORT INFORMATION MIGHT BE OUTDATED OR DEPRECATED

On 25/09/2010 at 11:43, xxxxxxxx wrote:

Howdy,

Hmmm, I don't see the Neighbor::Init() function in your code.

Adios,
Cactus Dan

THE POST BELOW IS MORE THAN 5 YEARS OLD. RELATED SUPPORT INFORMATION MIGHT BE OUTDATED OR DEPRECATED

On 25/09/2010 at 11:46, xxxxxxxx wrote:

Howdy,

Take a look at this thread:
https://plugincafe.maxon.net/topic/1229/564_neighboring-vertices

Adios,
Cactus Dan

THE POST BELOW IS MORE THAN 5 YEARS OLD. RELATED SUPPORT INFORMATION MIGHT BE OUTDATED OR DEPRECATED

On 25/09/2010 at 11:55, xxxxxxxx wrote:

Thanks for the reply Dan.

I added what you mentioned and am still getting the same result.    Here's the code I have.

  
  
BaseDocument *doc = mdat.doc;  
  BaseObject *op = doc->GetActiveObject();  
  BaseContainer *bc = mdat.bc;  
  
  PolygonObject *objPoly = (PolygonObject * )op;  
  if(!objPoly) return FALSE;  
   
  AutoAlloc<Modeling> mod;  
  if (!mod || !mod->InitObject(objPoly)) return FALSE;  
  
  LONG pointCount = objPoly->GetPointCount();  
  LONG polyCount    = objPoly->GetPolygonCount();  
  
  CPolygon * polys = objPoly->GetPolygonW();  
  Real width = bc->GetReal(CHAMFER_WIDTH);  
  
  Neighbor n;  
  n.Init(pointCount, polys, polyCount, NULL);  
  
  GePrint("BEFORE");  
  
  PolyInfo *pli  = NULL;  
  if (!pli) return FALSE;  
  
  GePrint("AFTER");  
  
  LONG pointA = 0, pointB = 0;  
    
  //Iterate Through Edges  
  for ( int i=0; i < polyCount; i++)  
  {  
      pli = n.GetPolyInfo(i);  
  
      for (int side = 0; side < 4; side++) // test all 4 sides of a polygon  
      {  
          // only proceed if edge has not already been processed  
          // and edge really exists (for triangles side 2 from c..d does not exist as c==d)  
          if (pli->mark[side] || (side==2 && (polys->c == polys->d))) continue;  
  
          switch (side)  
          {  
                
              case 0: pointA = polys[i].a; pointB = polys[i].b; break;  
              case 1: pointA = polys[i].b; pointB = polys[i].c; break;  
              case 2: pointA = polys[i].c; pointB = polys[i].d; break;  
              case 3: pointA = polys[i].d; pointB = polys[i].a; break;  
                        
          }  
  
          //Split Edges  
          mod->SplitEdge(objPoly, pointA, pointB, width);  
          EventAdd();  
    
      }  
  }  
  
  //Delete Original Points  
  for (int i=0; i < pointCount; i++)  
  {  
  
      mod->DeletePoint(objPoly, i);  
  }  
    
  
  if (!mod->Commit()) return FALSE;  
    
  EventAdd();  
    
  return TRUE;  
  

You may notice there are GePrint()  before and after the check for the pli pointer.  Only the BEFORE shows up in the console..  For some reason pli is not available?

Any other thoughts?

Thanks again.

~Shawn

THE POST BELOW IS MORE THAN 5 YEARS OLD. RELATED SUPPORT INFORMATION MIGHT BE OUTDATED OR DEPRECATED

On 25/09/2010 at 12:02, xxxxxxxx wrote:

Howdy,

Hehehe, well take a good look at these 2 lines:

PolyInfo *pli = NULL;   
if (!pli) return FALSE;

... can you say DOH!

Hey, I've been there; done that; before, too.

Adios,
Cactus Dan

THE POST BELOW IS MORE THAN 5 YEARS OLD. RELATED SUPPORT INFORMATION MIGHT BE OUTDATED OR DEPRECATED

On 25/09/2010 at 12:06, xxxxxxxx wrote:

LOL..  HAHAHAHAHA.  So basically I set it to nothing and then check if it's nothing.  HAHAHAH   I'm a genious.   Thanks Dan.

~Shawn

THE POST BELOW IS MORE THAN 5 YEARS OLD. RELATED SUPPORT INFORMATION MIGHT BE OUTDATED OR DEPRECATED

On 25/09/2010 at 12:08, xxxxxxxx wrote:

What do I initialize pli to?   for a Polyinfo ?

Could I do

PolyInfo *pli = new PolyInfo;

THE POST BELOW IS MORE THAN 5 YEARS OLD. RELATED SUPPORT INFORMATION MIGHT BE OUTDATED OR DEPRECATED

On 25/09/2010 at 12:16, xxxxxxxx wrote:

hmmmm.. .  I am initializing it before it's used with ..

pli = n.GetPolyInfo(i);  

Why am I getting an error that it's not initialized..  That's weird

THE POST BELOW IS MORE THAN 5 YEARS OLD. RELATED SUPPORT INFORMATION MIGHT BE OUTDATED OR DEPRECATED

On 25/09/2010 at 12:18, xxxxxxxx wrote:

problem solved..  I just initialized it first with

n.GetPolyInfo(0)

THE POST BELOW IS MORE THAN 5 YEARS OLD. RELATED SUPPORT INFORMATION MIGHT BE OUTDATED OR DEPRECATED

On 25/09/2010 at 12:46, xxxxxxxx wrote:

One more question,   Is there a way to reindex the points in my object?   I am creating a bunch of new points which are all indexed as they are added which makes the indices all over the place and when the geometry is created the shape looks crazy.  The points are in the right spot but the indices are all over the place..   🙂

Thanks,

~Shawn

THE POST BELOW IS MORE THAN 5 YEARS OLD. RELATED SUPPORT INFORMATION MIGHT BE OUTDATED OR DEPRECATED

On 26/09/2010 at 07:43, xxxxxxxx wrote:

Howdy

Well, I think the modeling functions normally add new points to the end of the points array, and new polygons to the end of the polygons array.

It would be trivial to insert a point in the middle of an array. You'd simply create a new array sized to the new point count, copy the block of memory above the insertion position to the new array, then copy the block of memory below the insertion position to the new array but move it 1 position down in the array, and finally copy the new point into the insertion position of the array.

This would be fine if you're just dealing with points. But, since polygons only hold point indices, for each point you add, you'll have to loop through all of the polygons, checking their existing point indices and if any polygons have point indices greater than or equal to the index of the inserted point, you'll have to add +1 to those indices. This also would be trivial if the object only has a few polygons, but if you have a mesh with thousands of polygons, it could get costly.

Adios,
Cactus Dan

THE POST BELOW IS MORE THAN 5 YEARS OLD. RELATED SUPPORT INFORMATION MIGHT BE OUTDATED OR DEPRECATED

On 26/09/2010 at 07:48, xxxxxxxx wrote:

Hey thanks for the reply Dan.  I think this is gonna take a little investigating to figure out why I am getting the results I am.  I have been reading through the3 Modeling Library documentation and am beginning to think it is more of a problem with the ngons.

see  this thread:

https://plugincafe.maxon.net/topic/5210/5204_ngon

I think I need to divert my attention to ngons.  🙂

THE POST BELOW IS MORE THAN 5 YEARS OLD. RELATED SUPPORT INFORMATION MIGHT BE OUTDATED OR DEPRECATED

On 26/09/2010 at 08:09, xxxxxxxx wrote:

Howdy,

Oh, OK I see. I misunderstood the question. I'm not really sure what's going on with that example in the other thread, as I haven't really delved too deeply into the modeling functions.

But, looking at your code again, I think you can do away with these lines:

PolyInfo *pli = n.GetPolyInfo(0);   
if (!pli) return FALSE;   

... and simply change this:

pli = n.GetPolyInfo(i);

... to this:

pli = n.GetPolyInfo(i); if(!pli) continue;

... or this:

pli = n.GetPolyInfo(i); if(!pli) return FALSE;

EDIT:
Actually in c++ it doesn't take any more processor time to define a variable type within a loop, so you don't really need to define the variable outside the loop.

You could do this:

PolyInfo *pli = n.GetPolyInfo(i); if(!pli) continue;

... inside the loop as long as the variable will only be used inside the loop.

Adios,
Cactus Dan

THE POST BELOW IS MORE THAN 5 YEARS OLD. RELATED SUPPORT INFORMATION MIGHT BE OUTDATED OR DEPRECATED

On 26/09/2010 at 12:49, xxxxxxxx wrote:

Thanks for the code improvement Dan.  Anyone else know anything about manipulating ngons in C4D?

This thread is where my problem is located.

https://plugincafe.maxon.net/topic/5210/5204_ngon

In fact,  I will stop posting on this Modeling thread now and go over there.  🙂