从样板文件中导入样式到当前文档

发布时间 2023-11-26 09:50:44作者: david96007

2023年11月24日

QQ群友提出一个问题:

SectionViewStyle的个别属性值无法获取,

从而无法进行修改,

开放的API中确实没有响应的枚举类型,

从而无法使用SectionViewStyle.GetDisplayStylePlan()这个方法获取到DisplayStyle,

于是我提出了采用导入样式的方法,

提前准备好自己的样板文件,

在样板文件中根据自己的需求设置好样式的属性值,

之后导入到当前的图形中,

替换现有的样式。

 

当前图形中有哪些样式,

这个要跟创建图形时使用的样板有关系,

如果使用的是AutoCAD的样板文件,

而不是Civil 3D的样板文件,

有些样式名称很可能是"标准"(中文版软件)。

 

上述的导入操作涉及到两个数据,

除了当前的文档数据之外,

还要打开已有的样板文件,

操作稍微复杂一些,

我整理了一下去年些的测试代码,

在此分享给大家。

// 样本文件,放置到dll文件夹位置
private static string styleDwgName = "\\Template\\样式.dwg";

/// <summary>
/// 2022年4月27日 Author:Myzw
/// 
/// </summary>
[CommandMethod("LandDesign", "SETest", "SETest", CommandFlags.Modal, null, "LandDesign", "IDH_SETest")]
public void C_SETest()
{
    string styleName = "标准";
    // 指定需要导入到当前文件内的样式
    if (ExportStyle(typeof(Autodesk.Civil.DatabaseServices.Styles.SectionViewStyle), styleName))
    {
        Application.DocumentManager.MdiActiveDocument.Editor.WriteMessage("\n样式:“{0}”成功导入到当前文档!",styleName);
    }
}
/// <summary>
/// 从样板文件中导出样式到当前文档
/// </summary>
/// <param name="type">样式类型</param>
/// <param name="styleName">样式名称</param>
/// <returns></returns>
public static bool ExportStyle(Type type, string styleName)
{
    bool flag = false;
    CivilDocument doc = null;
    // 注意目标文档是当前打开的文件
    Database destDb = Application.DocumentManager.MdiActiveDocument.Database;
    if (destDb == null) return false;

    string path = Path.GetDirectoryName(System.Reflection.Assembly.GetExecutingAssembly().Location) + styleDwgName;
    if (!File.Exists(path))
    {
        System.Windows.MessageBox.Show("样式.dwg 文件不存在!");
        return false;
    }
    using (Database db = new Database(false, true))
    {
        db.ReadDwgFile(path, FileOpenMode.OpenForReadAndReadShare, false, "");
        doc = CivilDocument.GetCivilDocument(db);
        if (doc == null)
        {
            return false;
        }

        using (Transaction ts = db.TransactionManager.StartTransaction())
        {
            switch (type.Name)
            {
                // 这里根据自己所需的样式类型添加case块
                case "CodeSetStyle":
                    if (doc.Styles.CodeSetStyles.Contains(styleName))
                    {
                        CodeSetStyle codeSetStyle = ts.GetObject(doc.Styles.CodeSetStyles[styleName], OpenMode.ForRead) as CodeSetStyle;
                        codeSetStyle.ExportTo(destDb, Autodesk.Civil.StyleConflictResolverType.Override);
                        flag = true;
                    }
                    break;
                case "ProfileViewStyle":
                    if (doc.Styles.ProfileViewStyles.Contains(styleName))
                    {
                        ProfileViewStyle profileViewStyle = ts.GetObject(doc.Styles.ProfileViewStyles[styleName], OpenMode.ForRead) as ProfileViewStyle;
                        profileViewStyle.ExportTo(destDb, Autodesk.Civil.StyleConflictResolverType.Override);
                        flag = true;
                    }
                    break;
                case "SectionViewStyle":
                    Autodesk.Civil.DatabaseServices.Styles.SectionViewStyle sectionViewStyle = ts.GetObject(doc.Styles.SectionViewStyles[styleName],
                        OpenMode.ForRead) as Autodesk.Civil.DatabaseServices.Styles.SectionViewStyle;
                    // 存在同名样式时,以覆盖的方式进行导入。
                    sectionViewStyle.ExportTo(destDb, Autodesk.Civil.StyleConflictResolverType.Override);
                    flag = true;
                    break;
            }
            ts.Abort();
        }
    }
    return flag;
}