GetDataAddressW()
-
On 05/05/2013 at 07:10, xxxxxxxx wrote:
User Information:
Cinema 4D Version: R14
Platform: Windows ;
Language(s) : C++ ;---------
Hi Folks,I'm trying to add points and polygons to an object's Tpoint and Tpolygon tag. But I can't seem to be able to write anything to them. This is what I've managed so far for trying to get points to the point tag:
BaseDocument *doc = GetActiveDocument(); BaseObject *obj= doc->GetActiveObject(); BaseTag *TPnt_Tag = obj->GetTag(Tpoint); if(!TPnt_Tag){GePrint("obj Error: Point tag not found.");} PointTag *PntTag = (PointTag* )TPnt_Tag; Vector *WritePoints = (Vector* )PntTag->GetDataAddressW(); // INSERT POINTS WritePoints[0] = Vector(-100,-100,-100); WritePoints[1] = Vector(-100,100,-100); WritePoints[2] = Vector(100,-100,-100); WritePoints[3] = Vector(100,100,-100); WritePoints[4] = Vector(100,-100,100); WritePoints[5] = Vector(100,100,100); WritePoints[6] = Vector(-100,-100,100); WritePoints[7] = Vector(-100,100,100); ProxyMan->Message(MSG_UPDATE); EventAdd();
I'm not worried about polys yet. Will have a go at working that one out for myself first. But from the code above, I'm trying to make a box with 8 points. I've gone a bit in circles so not really sure where to go to from here. I thought I may have to Alloc/Init the point count, but I'm not sure where that might fit in? Is someone able to bump me in the next possible direction here?
Cheers,
WP.
-
On 05/05/2013 at 11:23, xxxxxxxx wrote:
I deleted my first post because I misunderstood your question.
I thought you were asking about selection tags.Here's an example of creating a custom hand built polygon object.
As far as I know. We can't add data to the tags that hold the points and polys directly.
AFAIK. We have to add them to the object itself. Then we can read and/or change the existing points in the tag after they have been created.BaseDocument *doc = GetActiveDocument(); AutoAlloc<PolygonObject> mypoly(4,1); //AutoAlloc automatically handles freeing memory for you Vector *gp = mypoly->GetPointW(); //Gets the array of points in the polygon and assigns it to a variable "gp" gp[0] = Vector(-100,0,-100); // Place the first point here gp[1] = Vector(-100,0,100); // Place the first point here gp[2] = Vector(100,0,100); // Place the first point here gp[3] = Vector(100,0,-100); // Place the fourth point here //Create the new poly based on the points CPolygon *p = mypoly->GetPolygonW(); //Get the polygon we created above and assign it to a variable "p" p->a = 0; p->b = 1; p->c = 2; //Assign the four points of the polygon to the same positions as the gp[] points above p->d = 3; p->d = mypoly->GetPointCount()-1; //<---Creates a quad polygon //p->a = mypoly->GetPointCount()-1; //<---Creates a tri polygon if desired mypoly->Message(MSG_UPDATE); //Update the changes made to our polygon from memory doc->InsertObject(mypoly.Release(), NULL, NULL); //Add it to the OM...Use Release() here so AutoAlloc doesn't automatically delete it EventAdd();
-ScottA
-
On 05/05/2013 at 22:00, xxxxxxxx wrote:
Shucks, I was all around that last night. But I left out the mypoly.Release(). I think not having that was causing some issues, and occasional crashes!
Never-the-less, what I'm trying to do is close to the above, but instead of adding a polygon object to the scene, I want to update one that's already there. This is partly why I was trying to go through the tags at one stage.
If I want to add/rebuild a polygon object that's already in the scene, what would I need to adjust with the above? I'm trying to use:
// obj is a poly BaseObject taken from a link field AutoAlloc<PolygonObject> mypoly = ToPoly(obj);
but Cinema crashes when it comes to adding the point vector data. I'm using:
mypoly->Resize(8,6); Vector *WritePoints = mypoly->GetPointW(); WritePoints[0] = Vector(-100,-100,-100); // crashes here on first point
to resize the object. But it just won't go past adding the point vectors. It crashes.
How would I go about updating a poly object that's already in the scene?
WP.
EDIT: forgot to say thanks Scott!
-
On 06/05/2013 at 03:52, xxxxxxxx wrote:
You are allocating a PolygonObject 'mypoly' to a casted existing object. Bad idea. Do it this way:
PolygonObject* mypoly = ToPoly(obj);
You should also verify that the linked object is indeed a PolygonObject type (unless you already do this for MSG_DESCRIPTION_CHECKDRAGANDDROP). If not checking in that Message(), do this:
if (!mypoly->IsInstanceOf(Opolygon)) return someerror;
-
On 06/05/2013 at 04:41, xxxxxxxx wrote:
Thanks Rob,
I must admit, I wasn't checking for whether it's a polygon object or not! "if" statement put in now!
This seems to have given me enough of a kick, I should be able to work out the rest from here! Thanks again,
WP.