[Closed] Creating plane with 3dsMax SDK
I want to create simple Plane (From standart primitives) object.
The problem is that I can’t find any info about Plane primitive object in documentation/sdk headers.
So, is there any way to create this type of object?
this should do it, you can change it to return the object and not the node
INode* createPlane(float width, float length, int wsegs, int lsegs)
{
SimpleObject2* planeObj = (SimpleObject2*)GetCOREInterface()->CreateInstance(GEOMOBJECT_CLASS_ID,PLANE_CLASS_ID);
if(planeObj)
{
INode* planeNode = GetCOREInterface()->CreateObjectNode(planeObj);
if(!planeNode)
{
planeObj->DeleteThis();
return NULL;
}
IParamBlock2* pb = (IParamBlock2*)planeObj->GetReference(0);
if(pb)
{
pb->SetValue(1,0,width);
pb->SetValue(0,0,length);
pb->SetValue(2,0,wsegs);
pb->SetValue(3,0,lsegs);
}
return planeNode;
}
return NULL;
}
Thanks much! :rolleyes:
For me, as a beginner with Max SDK is a bit strange why some classes has its own interface and some hasn’t (like Box and Sphere have SetParams() method).
the problem is the sdk shouldn’t have to provide an interface for every type of object it just happens that a few object that are used else where in the sdk so it probably made sense at the time to make access a bit “easier” so to speak. The example I showed didn’t have to use simpleobject2 as the class i could have just as easily used object. The problem then is knowing the structure of the parameter block.
Well, could you please show an example for text object (TEXT_CLASS_ID) ?
I thought I could use same way for it, but this thing looks differently.
edited because it’s rubbish
this should do it
INode* CreateText(char* text, char* font, float size)
{
SimpleSpline* splineObj = (SimpleSpline*)GetCOREInterface()->CreateInstance(SHAPE_CLASS_ID,Class_ID(TEXT_CLASS_ID,0));
if(splineObj)
{
INode* textNode = GetCOREInterface()->CreateObjectNode(splineObj);
if(!textNode)
{
splineObj->DeleteThis();
return NULL;
}
ITextObject* textObj= GetTextObjectInterface(splineObj );
if(textObj)
{
textObj->ChangeFont(font,0);
textObj->ChangeText(text);
splineObj->GetParamBlock()->SetValue(TEXT_SIZE,0,size); // documentation is wrong this is the right way
}
splineObj->UpdateShape(0);
return textNode;
}
return NULL;
}
see ITextObject Class Reference in the sdk documentation
Anyone know if it’s possible to set the “Real-World Map Size” option when creating the plane ?
use RealWorldMapUtils.h methods
(
g = (dotNetClass "Autodesk.Max.GlobalInterface").Instance
obj = g.animatable.getAnimByHandle (dotNetObject "System.UIntPtr" (getHandleByAnim (createInstance plane)))
/* set RealWorldMapSize on */
g.SetUsePhysicalScaleUVs obj (RealWorldMapSize = true)
inode = g.coreinterface7.CreateObjectNode obj
g.coreinterface7.SelectNode inode (clear_prev_selection = true)
format "RealWorldMapSize: %\n" $.RealWorldMapSize
)
#include "RealWorldMapUtils.h"
def_visible_primitive(MakeRWPlane, "MakeRWPlane");
Value* MakeRWPlane_cf(Value **arg_list, int count)
{
Object* planeObj = (Object*)GetCOREInterface()->CreateInstance(GEOMOBJECT_CLASS_ID,PLANE_CLASS_ID);
if(planeObj)
{
INode* planeNode = GetCOREInterface()->CreateObjectNode(planeObj);
if(!planeNode)
{
planeObj->DeleteThis();
return &undefined;
}
SetUsePhysicalScaleUVs( planeObj, true );
return MAXNode::intern(planeNode);
}
return &undefined;
}