符老师 C#创建与放置共享单元太耗内存 想试试C++创建 但函数mdlSharedCell_create 中参数scOverride 、relativeMode 、assocOrigin 不是太明白,还有一个求问符老师怎么放置共享单元呢 ?
Mstn中元素的颜色、线型、线宽受很多因素控制的,例如你看到的颜色不一定是元素自身的颜色,层定义里边可以设置一个override的颜色,如果元素在这个层下且视图属性的level override打开的话,元素自身的颜色将会被覆盖掉。下图是SDK中scOverride的定义,我猜测可能就是控制是否使用单元子元素自身的这些或者所在层的这些属性。relativeMode 根据文档中的注释,感觉应该是控制新创建的单元放在激活层还是共享单元定义中指定的层。assocOrigin应该是可以给新创建的共享单元指定一个定位点,一般就用默认的就行。这些都是根据文档和SDK中的定义猜测的,你可以具体测试一下。
符老师
//创建共享单元 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元素。