问题:使用DgnElementSetTool,选择DimensionElement后,修改标注高度,在OnDynamicFrame中DoRedraw不生效,并没有动态更新,
请上传您的代码。
protected override void OnDynamicFrame(DgnButtonEvent ev) { if (!GetAnchorPoint(out origin)) return; if (ElementAgenda.GetCount() <= 0) return; DgnModel dgnModel = Session.Instance.GetActiveDgnModel(); RedrawElems redrawElems = new RedrawElems(); redrawElems.SetDynamicsViewsFromActiveViewSet(Session.GetActiveViewport()); redrawElems.DrawMode = DgnDrawMode.TempDraw; redrawElems.DrawPurpose = DrawPurpose.Dynamics; for (uint i = 0; i < ElementAgenda.GetCount(); i++) { Element ele = ElementAgenda.GetEntry(i); if (ele is DimensionElement) { DimensionElement dimEle = dgnModel.FindElementById(ele.ElementId) as DimensionElement; dimEle.GetHeight(out double oldH); double newH = endPt.Y - origin.Y; dimEle.SetHeight(newH + oldH); redrawElems.DoRedraw(dimEle); } } }
既然已经从ElementAgenda中拿到这个ele了,为何还要再调用dgnModel.FindElementById去重新拿?是否已经直接针对这个ele执行您的修改动作呢?
感觉标注需要调用ReplaceInModel替换掉文件中的元素才能更新其显示,所以没办法直接用RedrawElems去重绘。
您好,我改为replace后,变成了这种效果
您可否方便将整个项目发过来供我们调试?ReplaceInModel应该是不行的,在OnDynamicFrame中不能做任何实质性的写元素动作。
【注意】:需要您单独做一个测试项目而不是您的真实项目。该测试项目中仅仅能体现您说的问题即可。
谢谢!
Answer Verified By: Liaoyuan Zhang
c#的接口有点问题,不过有workaround的方法,如下所示实现您的OnDynamicFrame函数:
unsafe protected override void OnDynamicFrame(DgnButtonEvent ev) { if (!GetAnchorPoint(out DPoint3d origin)) return; if (ElementAgenda.GetCount() <= 0) return; DgnModel dgnModel = Session.Instance.GetActiveDgnModel(); RedrawElems redrawElems = new RedrawElems(); redrawElems.SetDynamicsViewsFromActiveViewSet(Session.GetActiveViewport()); redrawElems.DrawMode = DgnDrawMode.TempDraw; redrawElems.DrawPurpose = DrawPurpose.Dynamics; DPoint3d endPt = ev.Point; for (uint i = 0; i < ElementAgenda.GetCount(); i++) { DimensionElement dimEle = ElementAgenda.GetEntry(i) as DimensionElement; if (null != dimEle) { long eleRef = 0; fixed (byte* eleHandle = &dimEle.ElementHandle[0]) { ManagedElementHandle* nativeEleHandle = (ManagedElementHandle*)eleHandle; eleRef = nativeEleHandle->m_elRef; dimEle.GetHeight(out double oldH); double newH = endPt.Y - origin.Y; dimEle.SetHeight(newH + oldH); nativeEleHandle->m_elRef = 0; redrawElems.DoRedraw(dimEle); nativeEleHandle->m_elRef = eleRef; } } } }
其中ManagedElementHandle的定义如下所示:
struct ManagedElementHandle { public long m_elRef; public long m_cacheElem; public long m_modelRef; public long m_descr; public long m_state; public bool m_isPersistent; public bool m_descrOwned; }