按照Bentley一步步学习MDL教程 第四章给MDL应用添加命令
![]()
目前已经对HelloWorld.cpp 四个函数createALine、createAComplexShape、createAProjectedSolid和createABsplineSurface修改如下
/*----------------------------------------------------+
| HelloWorld.cpp |
+-----------------------------------------------------*/
#include <MicroStationAPI.h>
#include <msdialog.fdf>
#include <mselmdsc.fdf>
#include <msbsplin.fdf>
#include "HelloWorldCmd.h"
/*extern "C" DLLEXPORT int MdlMain (int argc,char *argv[])
{
mdlDialog_dmsgsPrint("Hello World");
return 0;
}*/
USING_NAMESPACE_BENTLEY_USTN_ELEMENT
double g_1mu;
void createALine (char *unparsed)
{
/*MSElement myLine;
DPoint3d pts[2];8
pts[0] = pts[1] = *basePtP;*/
MSElement myLine;
DPoint3d basePt={0,0,0}, pts[2]; pts[0] = pts[1] = basePt;
pts[1].x += g_1mu*2; pts[1].y += g_1mu;
mdlLine_create (&myLine, NULL, pts);
EditElemHandle eeh (&myLine, ACTIVEMODEL);
eeh.AddToModel (ACTIVEMODEL);
}
void createAComplexShape (char *unparsed)
{
/*MSElement el;
MSElementDescrP edP = NULL;
DPoint3d pts[3], tmpPt;
mdlComplexChain_createHeader (&el, 1, 0);
mdlElmdscr_new (&edP, NULL, &el);
pts[0] = pts[1] = pts[2] = *basePtP;*/
MSElement el;
MSElementDescrP edP = NULL;
DPoint3d basePt, pts[3], tmpPt;
basePt.x = 1.7*g_1mu; basePt.y = -0.3*g_1mu; basePt.z = -0.6*g_1mu;
mdlComplexChain_createHeader (&el, 1, 0);
mdlElmdscr_new (&edP, NULL, &el);
pts[0] = pts[1] = pts[2] = basePt;
pts[1].x += g_1mu*0.3; pts[1].y += g_1mu*0.7;
pts[2].x += g_1mu; pts[2].y += g_1mu;
mdlArc_createByPoints (&el, NULL, pts);
mdlElmdscr_appendElement (edP, &el);
tmpPt = pts[0]; pts[0] = pts[2]; pts[2] = tmpPt;
pts[1].x = pts[0].x; pts[1].y = pts[2].y;
mdlLineString_create (&el, NULL, pts, 3);
mdlElmdscr_appendElement (edP, &el);
EditElemHandle eeh (edP, true, false);
eeh.AddToModel (ACTIVEMODEL);
}
void createAProjectedSolid (char *unparsed)
{
MSElement el;
MSElementDescrP sectionEdP = NULL, solidEdP = NULL;
DPoint3d basePt,pts[6], pt1, pt2;
basePt.x = 3.2*g_1mu; basePt.y = -0.6*g_1mu; basePt.z = -1.2*g_1mu;
pts[0] = basePt;
//pts[0] = *basePtP;
pts[1].x = pts[0].x; pts[1].y = pts[0].y - g_1mu/2; pts[1].z = pts[0].z;
pts[2].x = pts[1].x + g_1mu/2; pts[2].y = pts[1].y; pts[2].z = pts[0].z;
pts[3].x = pts[2].x; pts[3].y = pts[2].y - g_1mu/2; pts[3].z = pts[0].z;
pts[4].x = pts[3].x + g_1mu/2; pts[4].y = pts[3].y; pts[4].z = pts[0].z;
pts[5].x = pts[4].x; pts[5].y = pts[0].y; pts[5].z = pts[0].z;
pt1 = pt2 = pts[0];
pt2.z += g_1mu;
mdlShape_create (&el, NULL, pts, 6, 0);
mdlElmdscr_new (§ionEdP, NULL, &el);
mdlSurface_project (&solidEdP, sectionEdP, &pt1, &pt2, NULL);
mdlElmdscr_freeAll (§ionEdP);
solidEdP->el.ehdr.type = SOLID_ELM;
EditElemHandle eeh (solidEdP, true, false);
eeh.AddToModel (ACTIVEMODEL);
}
void createABsplineSurface (char *unparsed)
{
MSElement el;
MSElementDescrP edP = NULL;
MSBsplineSurface bsSurface;
MSBsplineCurve bsCurves[4];
DPoint3d basePt, arcPts[4][3];
basePt.x = 5.4*g_1mu; basePt.y = -2.3*g_1mu; basePt.z = -1.8*g_1mu;
arcPts[0][0] = arcPts[0][1] = arcPts[0][2] = basePt
//arcPts[0][0] = arcPts[0][1] = arcPts[0][2] = *basePtP;
arcPts[0][1].x += g_1mu/2; arcPts[0][1].z += g_1mu/2;
arcPts[0][2].x += g_1mu;
arcPts[1][0] = arcPts[1][1] = arcPts[1][2] = arcPts[0][2];
arcPts[1][1].y += g_1mu/2; arcPts[1][1].z += g_1mu/2;
arcPts[1][2].y += g_1mu;
arcPts[2][0] = arcPts[2][1] = arcPts[2][2] = arcPts[1][2];
arcPts[2][1].x -= g_1mu/2; arcPts[2][1].z += g_1mu/2;
arcPts[2][2].x -= g_1mu;
arcPts[3][0] = arcPts[3][1] = arcPts[3][2] = arcPts[2][2];
arcPts[3][1].y -= g_1mu/2; arcPts[3][1].z += g_1mu/2;
arcPts[3][2] = *basePtP;
for (int i=0; i<4; i++)
{
mdlArc_createByPoints (&el, NULL, arcPts[i]);
mdlElmdscr_new (&edP, NULL, &el);
mdlBspline_convertToCurve (&bsCurves[i], edP);
mdlElmdscr_freeAll (&edP);
}
if (SUCCESS == mdlBspline_coonsPatch (&bsSurface, bsCurves))
{
mdlBspline_createSurface (&edP, NULL, &bsSurface);
EditElemHandle eeh (edP, true, false);
eeh.AddToModel (ACTIVEMODEL);
mdlBspline_freeSurface (&bsSurface);
}
for (int i=0; i<4; i++)
mdlBspline_freeCurve (&bsCurves[i]);
}
extern "C" DLLEXPORT int MdlMain (int argc, char *argv[])
{
g_1mu = mdlModelRef_getUorPerMaster(ACTIVEMODEL);
/*DPoint3d basePt = {0,0,0};
createALine (&basePt);
basePt.x += g_1mu*1.7; basePt.y -= g_1mu*0.3; basePt.z -= g_1mu*0.6;
createAComplexShape (&basePt);
basePt.x += g_1mu*1.5; basePt.y -= g_1mu*0.3; basePt.z -= g_1mu*0.6;
createAProjectedSolid (&basePt);
basePt.x += g_1mu*2.2; basePt.y -= g_1mu*1.7; basePt.z -= g_1mu*0.6;
createABsplineSurface (&basePt);
return 0;*/
RscFileHandle rscFileH;
mdlResource_openFile (&rscFileH, NULL, RSC_READ);
mdlParse_loadCommandTable (NULL);
Private MdlCommandNumber commandNumbers [] =
{
{createALine, CMD_HELLOWORLD_CREATE_LINE},
{createAComplexShape, CMD_HELLOWORLD_CREATE_COMPLEXSHAPE},
{createAProjectedSolid, CMD_HELLOWORLD_CREATE_PROJECTEDSOLID},
{createABsplineSurface, CMD_HELLOWORLD_CREATE_BSPLINESURFACE},
0
};
mdlSystem_registerCommandNumbers (commandNumbers);
return 0;
}