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 27/11/2009 at 14:52, xxxxxxxx wrote:
User Information: Cinema 4D Version: 11 Platform: Windows ; Language(s) :
--------- I am trying to use SendModelingCommand() to call the split command in C4D.
This is the code I am using.
PolygonObject* objPoly; objPoly=(PolygonObject* )obj; if (!objPoly->IsInstanceOf(Opolygon)) return false; LONG id = dc->id[0].id; ModelingCommandData mdat; BaseSelect *selected = objPoly->GetPolygonS(); if (!selected) return FALSE; BaseDocument * doc=obj->GetDocument(); BaseSelect * backupSel=NULL; LONG lngI=0; LONG lngPolygonCount=objPoly->GetPolygonCount(); LONG lngSymPlane = data->GetReal(SYMMETRY_PLANE); LONG lngMirroredSide = data->GetReal(MIRRORED_SIDE); Vector * arrPoints=objPoly->GetPointW(); CPolygon * arrPolygons=objPoly->GetPolygonW(); CPolygon * hiddenPolygons=objPoly->GetPolygonW(); mdat.mode = MODIFY_POLYGONSELECTION; mdat.doc = doc; mdat.bc = data; mdat.op = objPoly; backupSel =BaseSelect::Alloc(); if (!backupSel)return FALSE; selected->CopyTo(backupSel); blnSymmetryEnabled=FALSE; if (id == DELETE) { if (data->GetLong(SIDE_CHOOSER)==CHOOSE_A) { //Check to see which polys will be hidden selected->DeselectAll(); for (lngI=0;lngI<lngPolygonCount;lngI++) { if (PolyOnEditableSide(arrPoints, arrPolygons, lngI, lngSymPlane, lngMirroredSide, lngOldPointCount, lngOldPolygonCount)) selected->Select(lngI); } SendModelingCommand(MCOMMAND_DELETE, mdat); EventAdd(EVENT_FORCEREDRAW); } else if (data->GetLong(SIDE_CHOOSER)==CHOOSE_B) { //Check to see which polys will be hidden selected->DeselectAll(); for (lngI=0;lngI<lngPolygonCount;lngI++) { if (!PolyOnEditableSide(arrPoints, arrPolygons, lngI, lngSymPlane, lngMirroredSide, lngOldPointCount, lngOldPolygonCount)) selected->Select(lngI); } SendModelingCommand(MCOMMAND_DELETE, mdat); EventAdd(EVENT_FORCEREDRAW); } } if (id == SPLIT) { if (data->GetLong(SIDE_CHOOSER)==CHOOSE_A) { //Check to see which polys will be hidden selected->DeselectAll(); for (lngI=0;lngI<lngPolygonCount;lngI++) { if (PolyOnEditableSide(arrPoints, arrPolygons, lngI, lngSymPlane, lngMirroredSide, lngOldPointCount, lngOldPolygonCount)) selected->Select(lngI); } SendModelingCommand(MCOMMAND_SPLIT, mdat); GePrint("Splitting A"); EventAdd(EVENT_FORCEREDRAW); } if (data->GetLong(SIDE_CHOOSER)==CHOOSE_B) { //Check to see which polys will be hidden selected->DeselectAll(); for (lngI=0;lngI<lngPolygonCount;lngI++) { if (!PolyOnEditableSide(arrPoints, arrPolygons, lngI, lngSymPlane, lngMirroredSide, lngOldPointCount, lngOldPolygonCount)) selected->Select(lngI); } SendModelingCommand(MCOMMAND_SPLIT, mdat); GePrint("Splitting B"); EventAdd(EVENT_FORCEREDRAW); } } backupSel->CopyTo(selected); BaseSelect::Free(backupSel); blnSymmetryEnabled=TRUE; return TRUE;
For some reason, the MCOMMAND_SPLIT is not doing anything. It selects all polygons on a certain side of the object and then runs the MCOMMAND_SPLIT but it's not doing anything.. Does anyone see a problem here?
Thanks,
~Shawn
On 28/11/2009 at 08:14, xxxxxxxx wrote:
You need to get the new object from the AtomArray* result:
// - Split PolygonSelection off into new Object //*---------------------------------------------------------------------------* BaseObject* GreeblerObj::SplitSelection(BaseObject* op, const Bool& deltags) //*---------------------------------------------------------------------------* { // Initialize General ModelingCommandData ModelingCommandData gmcd; gmcd.doc = NULL; gmcd.op = op; gmcd.bc = NULL; gmcd.mode = MODIFY_POLYGONSELECTION; gmcd.flags = 0L; // Split selected polygons (tops) into new object if (!(SendModelingCommand(MCOMMAND_SPLIT, gmcd) && gmcd.result)) return NULL; BaseObject* top = static_cast<BaseObject*>(gmcd.result->GetIndex(0L)); AtomArray::Free(gmcd.result); return top; }
Afterwards, you'll need to insert into the BaseDocument yourself if necessary.