[MSCE C#]DgnElementSetTool修改标注

问题:使用DgnElementSetTool,选择DimensionElement后,修改标注高度,在OnDynamicFrame中DoRedraw不生效,并没有动态更新,

Parents Reply Children
  • 您可否方便将整个项目发过来供我们调试?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;
        }

    Answer Verified By: Liaoyuan Zhang