#include "closestPointOnCurveCmd.h"
#include "closestTangentUAndDistance.h"
#include "closestPointOnCurveStrings.h"
closestPointOnCurveCommand::closestPointOnCurveCommand()
{
}
closestPointOnCurveCommand::~closestPointOnCurveCommand()
{
}
void *closestPointOnCurveCommand::creator()
{
return new closestPointOnCurveCommand;
}
MSyntax closestPointOnCurveCommand::newSyntax()
{
return syntax;
}
bool closestPointOnCurveCommand::isUndoable() const
{
return true;
}
{
queryFlagSet = argData.isQuery();
inPositionFlagSet = argData.isFlagSet("inPosition");
positionFlagSet = argData.isFlagSet("-position");
normalFlagSet = argData.isFlagSet("-normal");
tangentFlagSet = argData.isFlagSet("-tangent");
paramUFlagSet = argData.isFlagSet("-paramU");
distanceFlagSet = argData.isFlagSet("-distance");
if (argData.isFlagSet("-name"))
argData.getFlagArgument("-name", 0, closestPointOnCurveNodeName);
else
closestPointOnCurveNodeName = "";
if (inPositionFlagSet)
{
argData.getFlagArgument("-inPosition", 0, inPosition.x);
argData.getFlagArgument("-inPosition", 1, inPosition.y);
argData.getFlagArgument("-inPosition", 2, inPosition.z);
}
else
{
inPosition.x = 0.0;
inPosition.y = 0.0;
inPosition.z = 0.0;
}
argData.getObjects(sList);
return redoIt();
}
MStatus closestPointOnCurveCommand::redoIt()
{
if (sList.length() == 0)
{
displayError(msg);
}
sList.getDagPath(0, curveDagPath);
{
sList.getSelectionStrings(0, selectionStrings);
msg.
format(msgFmt, selectionStrings[0]);
displayError(msg);
}
if (!queryFlagSet)
{
if (closestPointOnCurveNodeName == "")
depNodeFn.
create(
"closestPointOnCurve");
else
depNodeFn.
create(
"closestPointOnCurve", closestPointOnCurveNodeName);
closestPointOnCurveNodeName = depNodeFn.
name();
if (inPositionFlagSet)
{
}
unsigned instanceNumber=0;
{
}
MPlug worldCurvePlug, inCurvePlug;
inCurvePlug = depNodeFn.
findPlug(
"inCurve",
true);
worldCurvePlug = depNodeFn.
findPlug(
"worldSpace",
true);
dgModifier.
connect(worldCurvePlug, inCurvePlug);
setResult(closestPointOnCurveNodeName);
}
else
{
double paramU, distance;
closestTangentUAndDistance(curveDagPath, inPosition, position, normal, tangent, paramU, distance);
if (!positionFlagSet && !normalFlagSet && !tangentFlagSet && !paramUFlagSet && !distanceFlagSet)
{
displayError(msg);
}
else if (distanceFlagSet && !(positionFlagSet || normalFlagSet || tangentFlagSet || paramUFlagSet))
setResult(distance);
else if (paramUFlagSet && !(positionFlagSet || normalFlagSet || tangentFlagSet || distanceFlagSet))
setResult(paramU);
else
{
if (positionFlagSet)
{
floatArrayResult.
append(position.
x);
floatArrayResult.
append(position.
y);
floatArrayResult.
append(position.
z);
}
if (normalFlagSet)
{
}
if (tangentFlagSet)
{
floatArrayResult.
append(tangent.
x);
floatArrayResult.
append(tangent.
y);
floatArrayResult.
append(tangent.
z);
}
if (paramUFlagSet)
floatArrayResult.
append(paramU);
if (distanceFlagSet)
floatArrayResult.
append(distance);
setResult(floatArrayResult);
}
}
}
MStatus closestPointOnCurveCommand::undoIt()
{
if (!queryFlagSet)
{
deleteCmd += closestPointOnCurveNodeName;
}
}