我在ORD中的二维放了一个具有特征定义的点,在三维里会生成一个单元,能不能我在二维里点显示的只是一个简单的图例而不是单元,三维里显示的是模型。
通过编程实现的话可以使用ViewCallback::SetSubstituteElemFunction设置一个回调函数,这个函数会在元素在视图绘制前被调用,相应的元素会被传递进来,您可以返回一个新的元素,这样视图里边就不再绘制原元素,而是绘制返回的新元素了。
MS学习资源:
MicroStation Wednesday视频分享
深入探讨MicroStation DGN基本概念系列
一步步学习MicroStation CE Addin开发
一步步学习MicroStation CE MDL开发
Answer Verified By: ZhangFan
郭老师,能否提供一个简单的示例,演示如何使用。谢谢。
请问您具体是哪一步不知道如何实现?这个函数相对来说还是比较简单的
在回调函数内,如何修改元素,是否能用新的元素替换。谢谢,给个简单的示例就行:如根据输入的元素创建一个二维元素。谢谢。
SubstituteElemStatus MyViewFunc_SubstituteElem ( MSElementDescrH newElem, // <= output if element being replaced ViewportP viewport, DgnPlatform::DrawPurpose purpose, ViewContextP context, ElementHandleCP elem // => current element ) { if (elem->GetElementType()== ELLIPSE_ELM) { CurveVectorPtr cvevec = ICurvePathQuery::ElementToCurveVector(*elem); DEllipse3d elli; cvevec->at(0)->TryGetArc(elli); DgnSphereDetail dgnSphere(elli.center, DPoint3d::FromZero().Distance(elli.vector0)); ISolidPrimitivePtr iSolidPtr = ISolidPrimitive::CreateDgnSphere(dgnSphere); EditElementHandle eeh; DraftingElementSchema::ToElement(eeh, *iSolidPtr, NULL, *ACTIVEMODEL); *newElem = eeh.ExtractElementDescr(); } return SubstituteElemStatus::SUBSTELEM_STATUS_Normal; }
郭老师,请帮忙分析一下为什么没有元素生成呢。切图的时候,在图纸模型中,当切换到缓存模式时以下代码触发。将绘制当前视口中所有元素从最小点到最大点的直线。谢谢。
SubstituteElemStatus CaculateDrawing::MySubstituteEle1(MSElementDescrH newEle, ViewportP viewport, DgnPlatform::DrawPurpose purpose, ViewContextP context, ElementHandleCP elem) { //仅用于刷新Drawing的时候,别的时候没法调用,这样做也比较安全 if (purpose == DrawPurpose::ExportVisibleEdges) { //测试目标:绘制元素最小点到最大点的直线 Transform AtoPTrans = Transform::FromIdentity(); DRange3d range; if (DetailingSymbolManager::CalculateElementRange(*elem, range, &AtoPTrans) == SUCCESS) { EditElementHandle eeh1; DSegment3d seg; DPoint3dCR basePt = range.low; DPoint3dCR targetPt = range.high; seg.Init(basePt, targetPt); ICurvePrimitivePtr pCurve = ICurvePrimitive::CreateLine(seg); bool is3D = ACTIVEMODEL->Is3d(); DraftingElementSchema::ToElement(eeh1, *pCurve, nullptr, is3D, *ACTIVEMODEL); *newEle = eeh1.ExtractElementDescr();//20221203经过测试,只有这样才能改变输出的元素 } } return SUBSTELEM_STATUS_Normal; }
ToElement传递的ACTIVEMODEL的话,应该吧点都变换到当前图纸下吧?CalculateElementRange返回的都还是参考模型下的坐标点。
增加了获取变换矩阵的方法,将点转换到了当前图纸,也不行。把is3D改为true,会看到线段,但是显示图层错误就死机了。尝试了好久,仍然无法理解是什么问题。谢谢。
ACTIVEMODEL换成elem->GetDgnModelP(),这样也不用变换坐标点了。
还是不行。请您指导。
程序改完以后,图纸更新了么?