cad.net 标注样式替代的处理

原因

lisp语句:

(setvar "dimtxt" 123)   ;控制标注文字高度

当我们使用这些标注样式变量,会令标注出现<样式替代>,那么怎么去掉这个东西呢?

(command "-dimstyle" "S" "dim100" "" "");保存样式

放弃<样式替代>

[CommandMethod(nameof(DimRestoreAndEnable))]
public void DimRestoreAndEnable()
{
    Database db = HostApplicationServices.WorkingDatabase;//当前的数据库
    Editor ed = Acap.DocumentManager.MdiActiveDocument.Editor;
    ed.WriteMessage(Environment.NewLine + "****惊惊连盒-恢复标注替代样式");

    db.Action(tr => {               
        using var oldDimData = (DimStyleTableRecord)tr.GetObject(db.Dimstyle, OpenMode.ForRead);
        db.SetDimstyleData(oldDimData);
    });
}

获取<样式替代>并且设置新标注样式

[CommandMethod(nameof(DimRestoreAndEnable))]
public static void DimRestoreAndEnable()
{
    Database db = HostApplicationServices.WorkingDatabase;//当前的数据库
    Editor ed = Acap.DocumentManager.MdiActiveDocument.Editor;
    ed.WriteMessage(Environment.NewLine + "****惊惊连盒-恢复标注替代样式");

    db.Action(tr => {                
        var currentDimData = db.GetDimstyleData();//临时样式的数据
        using var dt = (DimStyleTable)tr.GetObject(db.DimStyleTableId, OpenMode.ForRead);

         // 若同时存在的样式,名字冲突了并不会覆盖,后者会变成空白名字在面板上
        var name = "我是新样式";
        if(dt.Has(name)) return;
        dt.UpgradeOpen();
        currentDimData = (DimStyleTableRecord)currentDimData.Clone(); //需要与否
        currentDimData.Name += name;

        dt.Add(currentDimData);
        tr.AddNewlyCreatedDBObject(currentDimData, true);
        db.SetDimstyleData(currentDimData);
    });
}

应用<样式替代>到当前标注上

[CommandMethod("DimRestoreAndEnable")]
public static void DimRestoreAndEnable()
{
    Database db = HostApplicationServices.WorkingDatabase;//当前的数据库
    Editor ed = Acap.DocumentManager.MdiActiveDocument.Editor;
    ed.WriteMessage(Environment.NewLine + "****惊惊连盒-恢复标注替代样式");

    db.Action(tr => {
        // 临时样式的数据
        var currentDimData = db.GetDimstyleData();
        // 当前标注样式
        using var dim = (DimStyleTableRecord)tr.GetObject(db.Dimstyle, OpenMode.ForRead);
        dim.UpgradeOpen();
        var name = dim.Name;//名字这些不能删除,否则会变空白
        dim.CopyFrom(currentDimData);//复制样式到当前
        dim.Name = name;
    });
}

起初我单纯认为当前标注样式是替代样式的宿主.
事实上并不是,否则删除当前标注样式,替代样式也应该删掉.
而我删掉之后,它会跑到新设定的当前标注上.
那么这就表示了替代样式是唯一的,也可称为临时样式,它仅仅为样式变量的副本.
而为什么有这个副本呢?
大概是临时对象设定到真实对象时候需要有一个缓存,
是单独给Lisp作为中间对象,
不然C#和ARX直接设置进去了啊.

如果新建一个标注样式替代旧的,
那么已有引用的会引发错误,
你需要遍历全图标注设置到新标注样式上,
所以这不是正确的思路.

刷新块内标注

dim.RecomputeDimensionBlock(true);

(完)

posted @ 2021-05-03 00:38  惊惊  阅读(1064)  评论(0编辑  收藏  举报