SelectionChanger example [SOLVED]
-
On 30/06/2015 at 12:09, xxxxxxxx wrote:
User Information:
Cinema 4D Version: R16
Platform: Mac OSX ;
Language(s) : C++ ;---------
Hi,I need to convert a selection of edges in a multi-selection of objects to points.
I know I have to create modelingcommanddata for this.
Here is what I've got so far:ModelingCommandData cd; cd.doc = doc; cd.arr = selection;
But how do I assign the left, right and tolerance??
https://developers.maxon.net/docs/cpp/2023_2/group___m_d_a_t_a___c_o_n_v_e_r_t_s_e_l_e_c_t_i_o_n.htmlLeft should be edges, right points and tolerance false.
Thanks in advance for your help and time!
Greetings,
Casimir Smets -
On 30/06/2015 at 14:10, xxxxxxxx wrote:
I would think that you set the three parameters for the MCOMMAND_CONVERTSELECTION call in a BaseContainer that is attached to the ModelingCommandData bc field.
BaseContainer bc; bc.SetInt32(MDATA_CONVERTSELECTION_LEFT, 1); // From Edges bc.SetInt32(MDATA_CONVERTSELECTION_RIGHT, 0); // To Points bc.SetBool(MDATA_CONVERTSELECTION_TOLERANT, false); ModelingCommandData cd; cd.doc = doc; cd.arr = selection; cd.bc = &bc; // Etc.
-
On 01/07/2015 at 01:50, xxxxxxxx wrote:
Hi Robert!
Yeah, I thought it to be something like that.
I've tested the following code, but it doesn't work:BaseContainer bc; bc.SetInt32(MDATA_CONVERTSELECTION_LEFT, 1); bc.SetInt32(MDATA_CONVERTSELECTION_RIGHT, 0); bc.SetBool(MDATA_CONVERTSELECTION_TOLERANT, false); ModelingCommandData cd; cd.doc = doc; cd.arr = selection; cd.bc = &bc; if (!SendModelingCommand(MCOMMAND_CONVERTSELECTION, cd)) { return false; } EventAdd();
I do this inside a CommandData/GeDialog plugin, inside Command of the dialog, when a button is pressed.
Does somebody have any idea what could be wrong?
Thanks in advance for your help and time!
Greetings,
Casimir Smets -
On 01/07/2015 at 04:44, xxxxxxxx wrote:
Hi Casimir,
you could also check the SelectionChanger class. Maybe it helps.
-
On 01/07/2015 at 05:02, xxxxxxxx wrote:
Hi Andreas,
Thanks for your answer!
That looks like something I could use!
I will definately look into thisGreetings,
Casimir Smets -
On 01/07/2015 at 08:25, xxxxxxxx wrote:
Hi,
I have one problem: I can't get the selected points.
If I try:if (!selectionChanger->GetPoints()) { GePrint("The selection changer couldn't get the selected points!"); }
the console prints out my GePrint...
Here is my relevant code:
AutoAlloc<AtomArray> selection; if (!selection) return false; Vector globalModelingAxis = doc->GetHelperAxis()->GetMg().off; Vector projection = newPosition; if (setX == true) projection.x = newPosition.x - globalModelingAxis.x; if (setY == true) projection.y = newPosition.y - globalModelingAxis.y; if (setZ == true) projection.z = newPosition.z - globalModelingAxis.z; AutoAlloc<SelectionChanger> selectionChanger; for (Int32 x = 0; x < selection->GetCount(); x++) { GePrint("Inside the object iteration!"); PolygonObject *opPoly = static_cast<PolygonObject*>(selection->GetIndex(x)); if (!opPoly) return false; GePrint("Inside the object iteration - first return!"); BaseSelect *edgeSelection = opPoly->GetEdgeS(); if (!edgeSelection) return false; GePrint("Inside the object iteration - second return!"); if (!selectionChanger->InitFromSelection(edgeSelection, Medges)) { GePrint("The selection changer didn't initialize!"); return false; } else { GePrint("The selection changer did initialize!"); } if (!selectionChanger->GetPointS()) { GePrint("The selection changer couldn't get the selected points!"); } BaseSelect *pointSelection = selectionChanger->GetPointS(); if (!pointSelection) return false; GePrint("Inside the object iteration - third return!"); Vector *points = opPoly->GetPointW(); if (!points) return false; GePrint("Inside the object iteration - END!"); for (Int32 y = 0; y < opPoly->GetPointCount(); y++) { if (pointSelection->IsSelected(y)) { GePrint("The point from edge is selected!"); points[y] = points[y] + projection; } } opPoly->Message(MSG_UPDATE); }
I hope somebody can help!
With kind regards,
Casimir Smets -
On 03/07/2015 at 05:04, xxxxxxxx wrote:
Hi,
you forgot to pass the object when initializing the SelectionChanger.
This:if (!selectionChanger->InitFromSelection(edgeSelection, Medges))
has to be:
if (!selectionChanger->InitFromSelection(edgeSelection, Medges, opPoly))
-
On 03/07/2015 at 06:06, xxxxxxxx wrote:
Hi Andreas,
Thanks for your answer! That did the trick!
You can mark this thread as solved!
Greetings,
Casimir Smets -
On 03/07/2015 at 06:25, xxxxxxxx wrote:
Hi,
One last thing, could you please change the name to something like this: SelectionChanger example.
Thank you very much!
Greetings,
Casimir Smets -
On 03/07/2015 at 06:26, xxxxxxxx wrote:
Good thought