cad.net 切换图层锁定状态后,图元无暗显的问题

autocad.net 切换图层锁定状态后,图元无暗显的问题

在cad二次开发中,我发现使用.net切换图层的锁定状态后,命令结束,图元并不会亮显(或暗显),失去了原有命令的效果

使用以下api可以解决

        ObjectId[] layerIds;
        LayerUtilities.RegenLayers(layerIds,LayerUtilities.RegenPending);

其中layerIds是你要刷新显示的图层表记录的id列表

但是我发现,此api在cad2015和cad2018上是有差异的,在cad2018上使用此函数会报错,因为cad2015到cad2024的api都是大概相同的,一般编译一个版本即可通用。
但此api在在cad2017版本修改到了CoreLayerUtilities类中,导致无法在低版本中使用,大家可以在使用的时候使用条件编译即可。

如果不想为了这一个地方添加复杂的条件编译,可以采用反射的方式

public static void RegenLayers(IEnumerable<ObjectId> objectIds)
    {
        var type = Acaop.Version.Major >= 21
            ? Assembly.Load("accoremgd")?.GetType("Autodesk.AutoCAD.Internal.CoreLayerUtilities")
            : Assembly.Load("acmgd")?.GetType("Autodesk.AutoCAD.Internal.LayerUtilities");
        var mi = type?.GetMethods().FirstOrDefault(e => e.Name == "RegenLayers");
        var pi = type?.GetProperties().FirstOrDefault(e => e.Name == "RegenPending");
        var regenPending = (int)(pi?.GetValue(null) ?? 0);
        mi?.Invoke(null, new object[] { objectIds.ToArray(), regenPending });
    }

通过判断版本号,反射调用不同的程序集,以达到目的。

posted @ 2024-01-29 18:15  DDYYHH  阅读(65)  评论(1编辑  收藏  举报