Pieced together from several places:
public class tcgsClass
{
[DllImport("acad.exe", CallingConvention = CallingConvention.Cdecl, EntryPoint = "?acedSetCurrentView@@YA?AW4ErrorStatus@Acad@@PAVAcDbViewTableRecord@@PAVAcDbViewport@@@Z")]
private static extern int acedSetCurrentView(IntPtr pVtr, IntPtr pVP);
[DllImport("acad.exe", CallingConvention = CallingConvention.Cdecl, EntryPoint = "acedTrans")]
static extern int acedTrans(double[] point, IntPtr fromRb, IntPtr toRb, int disp, double[] result);
public tcgsClass()
{
//
// Nothing to do here...
//
}
// Define Command "MickyDViewTest"
[CommandMethod("MickyDViewTest")]
static public void MickyDViewCommand()
{
Document pCurrentDoc = acadApp.DocumentManager.MdiActiveDocument;
Editor pEd = pCurrentDoc.Editor;
short viewMode = (short)acadApp.GetSystemVariable("VIEWMODE");
double backZ = (double)acadApp.GetSystemVariable("BACKZ");
double frontZ = (double)acadApp.GetSystemVariable("FRONTZ");
double lensLength = (double)acadApp.GetSystemVariable("LENSLENGTH");
double viewSize = (double)acadApp.GetSystemVariable("VIEWSIZE");
double viewTwist = (double)acadApp.GetSystemVariable("VIEWTWIST");
Point3d viewCtr = (Point3d)acadApp.GetSystemVariable("VIEWCTR");
Point3d target = (Point3d)acadApp.GetSystemVariable("TARGET");
// Direct cast to vector3d fails here, so go for a point...
Point3d viewDirTemp = (Point3d)acadApp.GetSystemVariable("VIEWDIR");
//...now convert it to an AcGeVector3d...
Vector3d viewDir = new Vector3d(viewDirTemp[0], viewDirTemp[1], viewDirTemp[2]);
ViewTableRecord pVtr = new ViewTableRecord();
pVtr.PerspectiveEnabled = (viewMode & 1) == 1;
pVtr.FrontClipEnabled = (viewMode & 2) == 2;
pVtr.BackClipEnabled = (viewMode & 4) == 4;
pVtr.FrontClipAtEye = (viewMode & 16) == 16;
pVtr.BackClipDistance = backZ;
ResultBuffer rbWCS = new ResultBuffer(new TypedValue(5003, 0));
ResultBuffer rbUCS = new ResultBuffer(new TypedValue(5003, 1));
ResultBuffer rbDCS = new ResultBuffer(new TypedValue(5003, 2));
double[] result = new double[]{0,0,0};
acedTrans(viewCtr.ToArray(), rbUCS.UnmanagedObject, rbDCS.UnmanagedObject, 0, result);
pVtr.CenterPoint = new Point2d(result[0], result[1]);
pVtr.FrontClipDistance = frontZ;
pVtr.LensLength = lensLength;
acedTrans(target.ToArray(), rbUCS.UnmanagedObject, rbWCS.UnmanagedObject, 0, result);
pVtr.Target = new Point3d(result);
acedTrans(viewDir.ToArray(), rbUCS.UnmanagedObject, rbWCS.UnmanagedObject, 1, result);
pVtr.ViewDirection = new Vector3d(result);
pVtr.Height = viewSize;
pVtr.Width = 1;
// Add some twist magic to see that it works...
pVtr.ViewTwist = viewTwist + 0.01;
acedSetCurrentView(pVtr.UnmanagedObject, IntPtr.Zero);
// Just to be safe...
pVtr.Dispose();
}
Dumpbin.exe from memory will give you the function name to call (the mangled one).