老师好:
再一次打扰、见谅!我现在自己创建了一个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 二次开发小白一枚
平凡人生 said:我也使用过由设计人员手工创建到一个Cell库(*.CEL),但是 成图时间太长,这个问题也和老师反映过
成图时间太长是指通过代码将Cell库中的Cell放入当前模型需要很长时间吗?如果是的话,请问是否使用的mdlCell_placeCell函数在调用?
平凡人生 said:这种cell 组成的构件库,主要有 创建大小、放置位置、调整角度等基本功能就可以
如果希望继续用当前的现场代码生成Cell的话,可以引入一个Transform(变换矩阵),它就含有缩放比例、移动和旋转这三个方面的信息。v正确地构造好这个Transform后,在你的mdlCell_setOriginAndRange(edP1);后调用mdlElmdscr_transform对生成的edP执行变换,然后再调用mdlElmdscr_add添加到模型中即可。
多谢老师!
老师好,我已经按照您说的 进行了初步尝试,但是 遇到如下两个问题:
前提:
因为是要创建由多个元素组建的复杂元素(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);//释放所有参数