从样板文件中导入样式到当前文档
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; }