符老师 C#创建与放置共享单元太耗内存 想试试C++创建 但函数mdlSharedCell_create 中参数scOverride 、relativeMode 、assocOrigin 不是太明白,还有一个求问符老师怎么放置共享单元呢 ?
符老师
//创建共享单元 KIBODY *Spherebody; MSElementDescrP SphereEdp ,shareCellEdp,fangZhiCellEdp; MSElement ShareCellSCElm,qiuEle; Transform Ts; RotMatrix rot; //画个球 DPoint3d moveSpherept={100*g_1mu,-50*g_1mu,0};//单元设置的基点 mdlKISolid_makeSphere(&Spherebody,5); mdlKISolid_bodyToElement (&SphereEdp, Spherebody, -1,-1, NULL, ACTIVEMODEL); mdlTMatrix_getIdentity (&Ts); mdlTMatrix_setTranslation (&Ts,&moveSpherept); mdlElmdscr_transform(SphereEdp,&Ts);//平移实体 mdlRMatrix_getIdentity(&rot); DPoint3d scalPt ={1,1,1};//单元放大的倍数 char cellName[MAX_TableNameLength] = "zhuxu";//单元名字 MSWChar wCellname[MAX_TableNameLength]; mdlCnv_convertMultibyteToUnicode(cellName,-1,wCellname,sizeof(wCellname)); qiuEle = SphereEdp->el; mdlKISolid_beginCurrTrans(ACTIVEMODEL); int state = mdlSharedCell_create(&ShareCellSCElm,&(qiuEle),&moveSpherept,&rot,&scalPt,wCellname,NULL,0,0,NULL); mdlKISolid_endCurrTrans(); mdlElmdscr_new(&shareCellEdp,NULL,&ShareCellSCElm); mdlElmdscr_add(shareCellEdp); mdlElmdscr_freeAll(&shareCellEdp);
您调用的这个mdlSharedCell_create是需要您首先连接了单元库,然后直接从单元库中根据单元名取得一个共享单元的。
如果你连接了系统的Sample2.cel,如下代码可以工作:
MSElement cell; mdlSharedCell_create (&cell, NULL, NULL, NULL, &scale, L"ARRO", NULL, FALSE, 0, NULL); if (SUCCESS != mdlSharedCell_makeSureDefExists (&cell)) { mdlDialog_openAlert ("可能没有连接单元库Sample2.cell"); return; } mdlSharedCell_setRange (&cell, ACTIVEMODEL); mdlElement_add (&cell);
请注意,共享单元是一个简单元素,用MSElement即可表达。mdlCell_attachLibrary函数可以用来连接单元库。
mdlSharedCell_makeSureDefExists能确认共享单元定义(SharedCellDefinition)是否已经添加到当前DGN中,SharedCellDefinition元素是复杂元素,要用MSElementDescr表达。
符老师 没有像C#(CreateSharedCellElement1 数量多太耗内存)那样的在dgn创建一个sharedcell 不用连接库
也有,那就是mdlSharedCell_addToFile,调用该函数前需要你创建一个SharedCell Definition元素。
符老师 有简单的例子吗 ?
今天抽空为您写了如下例子,请参考:
void createSharedCellOnTheFly () { MSElement sharedCell; DPoint3d scale = {1.0, 1.0, 1.0}, org = {10000, 10000, 0}; MSWCharP wCellName = L"My-SharedCell"; mdlSharedCell_create (&sharedCell, NULL, &org, NULL, &scale, wCellName, NULL, FALSE, 0, NULL); if (SUCCESS != mdlSharedCell_makeSureDefExists (&sharedCell)) { MSElement el; MSElementDescrP edP = NULL; mdlSharedCell_createDefinitionElement (&el, wCellName, FALSE); mdlElmdscr_new (&edP, NULL, &el); mdlEllipse_create (&el, NULL, NULL, 1000, 1000, NULL, -1); mdlElmdscr_appendElement (edP, &el); mdlSharedCell_setOriginAndRange (edP, NULL); mdlSharedCell_addDefinitionElements (edP, NULL,NULL); mdlElmdscr_freeAll (&edP); } mdlSharedCell_setRange (&sharedCell, ACTIVEMODEL); mdlElement_add (&sharedCell); }
Answer Verified By: Andy
可以画出来 , 顺便问问符老师,mdlSharedCell_setRange 我看文档是搜索ACTIVEMODEL模型中的共享单元,mdlSharedCell_makeSureDefExists 如果这是SUCCESS ,那么mdlSharedCell_setRange不应该在ACTIVEMODEL模型中搜索共享单元(mdlSharedCell_makeSureDefExists==SUCCESS 的话说明共享单元在库中,不在ACTIVEMODEL中),还是我对mdlSharedCell_setRange理解有误?
mdlSharedCell_setRange顾名思义,是用来修正SharedCell元素的范围的,每个元素在元素头中都保存有一个范围,如果这个范围值出错就会造成定位问题。调用一下是为了保险,此种情况下不调用估计也可以。但在往Elmdscr添加多个元素后,Elmdscr不知道整个Cell的范围是多大,此种情况下必须要调用一下。
mdlSharedCell_makeSureDefExists是用来确定共享单元的定义是否在当前文件中。
符老师, 感觉逻辑有点不通呢 , 如果"My-SharedCell"不存在 就创建SharedCellDefinition 但里面的没有一个函数给变量MSElement sharedCell赋值,但最后直接mdlElement_add (&sharedCell); 逻辑这说不通呢