MSCE C++ cell 旋转中心点(旋转基准点)设置问题?

老师好:

         再一次打扰、见谅!我现在自己创建了一个cell 、demo代码如下:

mdlCell_create(&cells , L"NewFCap" , NULL , false);
mdlElmdscr_new(&edP, NULL, &cells);//新建cell元素描述符 并将该描述符与cell的元素进行关联。
CurveVectorPtr pCurveVec = CurveVector::Create(CurveVector::BOUNDARY_TYPE_Outer);
pCurveVec->Add(ICurvePrimitive::CreateLineString(pts, 5));
DraftingElementSchema::ToElement(eeh, *pCurveVec, nullptr, ACTIVEMODEL->Is3d(), *ACTIVEMODEL);
mdlElmdscr_appendDscr(edP1, eeh.GetElementDescrP () );//将矩形元素追加cell中作为子元素

mdlCell_setOriginAndRange(edP1);//设置中心点
mdlElmdscr_add(edP1);//将生成的cell 实体添加到模型中 也就是设计文件中
mdlElmdscr_freeAll(&edP1);//释放所有参数

但是,放置这些cell的时候   放置角度都是一样的  而不是按照放置时候设置的中心点来旋转的(因为确实没有设置角度的环节或步骤),因此肯定是有问题的。

所以请教老师 ,放置cell时候,如果想把放置角度也添加进去,应该使用哪一个API?

辛苦老师  帮忙解答一下,感谢万分!!!!

  • 不知您对Cell的基本概念是否有正确的理解? Cell最常用的方式不是像你代码中所示,而是事先由设计人员手工创建到一个Cell库(*.CEL)中的。比如一个阀门库Value.CEL中可以含有数百个不同种类的阀门Cell。对于这种最常用的情况,我们用函数mdlCell_attachLibrary来连接这个Value.cel,然后根据阀门的名字调用mdlCell_placeCell就能将某个阀门放入当前的模型(model)中。在mdlCell_placeCell中能指定插入点、旋转角、缩放比例等一系列参数的。

    你这段代码演示的是不依赖一个Cell库,现场绘制图形创建一个Cell的,这种情况其实并不常用,失去了Cell本身的主要意义。



  • 老师好,字面上的理解看过一些就是区别于元素的,使用基本元素对复杂元素进行组合,方便以整体为单位使用。当然我的demo 就是一个矩形的面做成了cell,确实和cell有些出入。

    但是我在应用中 肯定不是这么简单的,比如四柱承台、花瓶墩等。

    另外 我也使用过由设计人员手工创建到一个Cell库(*.CEL),但是 成图时间太长,这个问题也和老师反映过,所以就考虑代码绘制,组件一个简单基本 常用的构建代码库。

    而这种cell 组成的构件库,主要有 创建大小、放置位置、调整角度等基本功能就可以。

    Bentley 二次开发小白一枚

  • 我也使用过由设计人员手工创建到一个Cell库(*.CEL),但是 成图时间太长,这个问题也和老师反映过

    成图时间太长是指通过代码将Cell库中的Cell放入当前模型需要很长时间吗?如果是的话,请问是否使用的mdlCell_placeCell函数在调用?

    这种cell 组成的构件库,主要有 创建大小、放置位置、调整角度等基本功能就可以

    如果希望继续用当前的现场代码生成Cell的话,可以引入一个Transform(变换矩阵),它就含有缩放比例、移动和旋转这三个方面的信息。v正确地构造好这个Transform后,在你的mdlCell_setOriginAndRange(edP1);后调用mdlElmdscr_transform对生成的edP执行变换,然后再调用mdlElmdscr_add添加到模型中即可。



  • 多谢老师!

    Bentley 二次开发小白一枚

  • 老师好,我已经按照您说的 进行了初步尝试,但是 遇到如下两个问题:

    前提:

    因为是要创建由多个元素组建的复杂元素(cell),比如说四柱承台,是由一个矩形承台+四个圆柱组成,构建的cell,我是用多个mdlElmdscr_appendDscr(edP, eeh1.GetElementDescrP ()), 将 ElementDescrP(承台和圆柱) 对象与 cell 的 MSElementDescrP对象进行的关联。

    我是先创建矩形承台,然后是四个圆柱,当圆柱创建完成后,cell创建完成,添加到设计文档中。

    问题:

       我的中心点是根据给出的矩形承台地面的中心点,作为基础,然后绘制矩形承台和四个圆柱的。所以我将mdlCell_setOriginAndRange(edP1);放在了矩形承台的mdlElmdscr_appendDscr(edP1, eeh.GetElementDescrP () );后面。

    这个时候如果不设置旋转角度,四柱承台的cell 是没有问题的。

    但是如果我想将四柱承台进行旋转

    1、如果放在矩形承台后,第一个圆柱前 则矩形承台会转飞,经判断是中心点是按照(0,0,0)点旋转的。而不是我设置的中心点。

    具体代码如下:可以执行的:

    mdlCell_create(&cells , L"NewFCap" , NULL , false);
    mdlElmdscr_new(&edP, NULL, &cells);//新建cell元素描述符 并将该描述符与cell的元素进行关联。

    ////////////////////////////矩形承台元素的绘制///////////////////////
    //Curve Vector Ptr:曲线向量ptr CurveVectorPtr:曲线修正系数
    CurveVectorPtr pCurveVec = CurveVector::Create(CurveVector::BOUNDARY_TYPE_Outer);
    pCurveVec->Add(ICurvePrimitive::CreateLineString(pts, 5));
    DVec3d extrusionVec = DVec3d::From(0, 0, CapCenterHigth);
    DgnExtrusionDetail data(pCurveVec, extrusionVec, true);//pCurveVec
    ISolidPrimitivePtr pSolid = ISolidPrimitive::CreateDgnExtrusion(data);
    DraftingElementSchema::ToElement(eeh, *pSolid, nullptr, *ACTIVEMODEL);
    mdlElmdscr_appendDscr(edP1, eeh.GetElementDescrP () );//将矩形元素追加cell中作为子元素
    mdlCell_setOriginAndRange(edP1);//设置中心点

    /*********************************绘制四个圆柱 中的第一个*************************************/
    EditElementHandle eeh1;
    DPoint3d bpt;
    bpt.x=pts[0].x+1234;
    bpt.y=pts[0].y+1345;
    bpt.z=pts[0].z;

    DEllipse3d arcPts = DEllipse3d::FromCenterRadiusXY(bpt,CircleR);//
    CurveVectorPtr pCurveVec = CurveVector::Create(CurveVector::BOUNDARY_TYPE_Outer);
    pCurveVec->Add(ICurvePrimitive::CreateArc(arcPts));

    DVec3d extrusionVec = DVec3d::From(0, 0, 12345);
    DgnExtrusionDetail data(pCurveVec, extrusionVec, true);//pCurveVec
    ISolidPrimitivePtr pSolid = ISolidPrimitive::CreateDgnExtrusion(data);
    DraftingElementSchema::ToElement(eeh, *pSolid, nullptr, *ACTIVEMODEL);

    mdlElmdscr_appendDscr(edP1, eeh1.GetElementDescrP () );//将矩形元素追加cell中作为子元素

    Transform transformP;

    RotMatrix jiaodu = RotMatrix::FromAxisAndRotationAngle(2, dunjiao[u]);
    mdlTMatrix_fromRMatrix(&transformP, &rotMatrix);
    mdlElmdscr_transform(&edP, &transformP);

    mdlElmdscr_add(edP1);//将生成的cell 实体添加到模型中 也就是设计文件中

    mdlElmdscr_freeAll(&edP1);//释放所有参数

    Bentley 二次开发小白一枚