/// <summary> /// 根据用户设置,格式化字符串为Unicode或者ASCII编码。并筛选符合条件的字符串返回。 /// </summary> /// <param name="name"></param> /// <returns></returns> internal string CleanPath(string name, ExportingOptions options) { //string 类型名为@string的变量,目的是防止与string重名。 string @string; //如果用户选择支持Unicode编码,那么将传入的字符串通过Utf16Encoder得到Utf16编码的字符串保存在@string中。 if (options.UnicodeSupport) { byte[] bytes = Utf16Encoder.GetBytes(name); @string = Utf16Encoder.GetString(bytes); } //否者使用ASCII编码。 else { byte[] bytes2 = usAsciiEncoder.GetBytes(name); @string = usAsciiEncoder.GetString(bytes2); } //将编码为特定格式的字符串赋值给字符类型的枚举。 IEnumerable <char> char_set = @string; //创建判断字符是否否和特定要求的委托方法 Func <char, bool> IsSADS; //S:空格、A:字母、D:数字、S:特殊标点符号。 if ((IsSADS = Inner.IsChar2) == null) { IsSADS = Inner.IsChar2 = new Func <char, bool>(Inner.tools.IsSADS); } //筛选一个表中有没有满足条件的数据,返回一个字符串。 return(new string(char_set.Where(IsSADS).ToArray())); }
/// <summary> /// //导出DAE模型, 文档、3D视图、用户设置 /// </summary> /// <param name="document">Revit活动视图的文档</param> /// <param name="view">视图</param> /// <param name="userSetting">用户设置</param> internal void ExportView3D(Document document, Autodesk.Revit.DB.View view3D, ExportingOptions userSetting) { //将文档和导出模型设置提交给 导出上下文对象。 MExportContext myExportContext = new MExportContext(document, userSetting); //TestExportContext testExportContext = new TestExportContext(document); //将文档和导出上下文对象提交给 autodesk默认导出对象。 CustomExporter customExporter = new CustomExporter(document, myExportContext) { IncludeGeometricObjects = false, //当通过导出上下文处理模型时,此标志将导出器设置为包括或排除几何对象(例如面和曲线)的输出。 ShouldStopOnError = false //如果在任何一种导出方法中发生错误,此标志将指示导出过程停止或继续。 }; //使用CustomExporter导出模型。 customExporter.Export(view3D); }
public Result Execute(ExternalCommandData commandData, ref string message, ElementSet elements) { UIApplication application = commandData.Application; UIDocument activeUIDocument = application.ActiveUIDocument; if (activeUIDocument == null) { return(Result.Cancelled); } Document document = activeUIDocument.Document; if (document == null) { return(Result.Cancelled); } if (document.ActiveView is View3D) //是否在三维视图下? { //创建面板,用于选择导出文件设置 ExporterDialog exporterDialog = new ExporterDialog(); exporterDialog.SaveFileDialog.FileName = document.Title; //设置文件名 exporterDialog.SaveFileDialog.FileName = exporterDialog.SaveFileDialog.FileName.Replace(".rvt", ".dae"); //替换文件后缀 //判断选择面板是否创建成功与导出的文件名非为空 if (exporterDialog.ShowDialog() == DialogResult.OK && exporterDialog.SaveFileDialog.FileName != "") { ExportingOptions userSetting = new ExportingOptions(); //创建选项设置 //保存用户的设置 userSetting.FilePath = exporterDialog.SaveFileDialog.FileName; //将设置的文件名赋予对象的路径变量中。 userSetting.SkipSmallerThan = (double)exporterDialog.SkipSmallerThan.Value; //设置跳过小于某一精度的物体。 userSetting.InsertionPoint = exporterDialog.InsertionPoint.SelectedIndex; //设置插入点 userSetting.SkipInteriorDetails = exporterDialog.SkipInteriorDetails.Checked; //设置是否跳过较小的几何体 userSetting.CollectTextures = exporterDialog.CollectTextures.Checked; //设置是否保护贴图 userSetting.UnicodeSupport = exporterDialog.UnicodeSupport.Checked; //设置Unicode支持 userSetting.GeometryOptimization = exporterDialog.GeometryOptimization.Checked; //设置是否优化几何体 userSetting.MainView3D = (document.ActiveView as View3D); //as 判断类型是否兼容,是强制转换,不是返回null。 userSetting.LevelOfDetail = exporterDialog.levelOfDetail.Value; // 设置导出模型精度等级。 //导出DAE模型, 文档、3D视图、用户设置 ExportView3D(document, document.ActiveView, userSetting); } } else { MessageBox.Show("请在三维视图中导出模型。"); } return(Result.Succeeded); }
/// <summary> /// 构造方法 /// </summary> /// <param name="document">Revit活动视图的文档</param> /// <param name="userSetting">保存导出的用户设置</param> public MExportContext(Document document, ExportingOptions userSetting) { //初始化类,接受revit文档,导出选项,创建纹理查找工具,接受指定资产类型的revit数组并转换为集合。 //创建解析首选项工具,并设置计算引用几何对象及设置提取几何图形精度为完整。 this.document = document; this.userSetting = userSetting; textureFinder = new TextureFinder(); //获取文档中所有Appearance assets(materials)迭代保存到libraryAssetSet集合里面。 IList <Asset> assets = document.Application.GetAssets(AssetType.Appearance); foreach (Asset asset in assets) { libraryAssetSet.Insert(asset); } //创建几何解析中的用户首选项。 Geometry_Options = document.Application.Create.NewGeometryOptions(); //确定是否计算对几何对象的引用。计算引用的几何对象。//使用这些选项提取的几何图形的详细程度。精细程度为完整。 Geometry_Options.ComputeReferences = true; Geometry_Options.DetailLevel = ViewDetailLevel.Fine; }
/// <summary> /// 重新编码整理名字 /// </summary> /// <param name="name"></param> /// <returns></returns> internal string CleanName(string name, ExportingOptions options) { string text; if (options.UnicodeSupport) { byte[] utf16Bytes = Utf16Encoder.GetBytes(name); text = Utf16Encoder.GetString(utf16Bytes); } else { byte[] asciiBytes = usAsciiEncoder.GetBytes(name); text = usAsciiEncoder.GetString(asciiBytes); } IEnumerable <char> char_set = text; Func <char, bool> IsSADM; //S:空格、A:字母、D:数字、M:标点符号。 if ((IsSADM = Inner.IsChar1) == null) { IsSADM = Inner.IsChar1 = new Func <char, bool>(Inner.tools.IsSADM); } text = new string(char_set.Where(IsSADM).ToArray()); return(SecurityElement.Escape(text)); }
/// <summary> /// 通过构建委托函数获得ExportedMaterial中的贴图路径做迭代器的选择函数判断路径非空。 /// 并定义导出材质的文件夹并将贴图放进这个文件夹。 /// </summary> /// <param name="documentAndMaterialIdToExportedMaterial">欲导出材质的revit文档及材质ID</param> internal void CollectTextures(Dictionary <Tuple <Document, ElementId>, ModelMaterial> documentAndMaterialIdToExportedMaterial, ExportingOptions options) { //将导出材质的文档和材质ID赋值给迭代器。 IEnumerable <ModelMaterial> expr_MaterialSet = documentAndMaterialIdToExportedMaterial.Values; //定义一个委托 in 为 ExportedMaterial, out为 string。 Func <ModelMaterial, string> TexturePath1; //这里是委托函数,若内部类定义的Func为空,就new 一个func并将内部类中getGetTexturePath1方法作为参数传递给func形成委托函数调用,之后赋值给 //内部类中的变量和此方法内部变量。 if ((TexturePath1 = Inner.TexturePath1) == null) { //把委托作为参数 TexturePath1 = Inner.TexturePath1 = new Func <ModelMaterial, string>(Inner.tools.GetTexturePath1); } //检查元素是否为空。 //使用Ienumerable.select() 吧定义好从导出材质获取贴图路径的委托方法作为参数传递。并排序,获取元素个数,判读是否为空。若为空,结束本函数。 if (expr_MaterialSet.Select(TexturePath1).Distinct <string>().Count <string>() == 0) { return; } //定义导出材质贴图路径的文件夹并保存在text变量中。 string text = Path.GetDirectoryName(options.FilePath) + "\\textures"; try { //尝试创建材质贴图文件夹textures。 Directory.CreateDirectory(text); } catch (Exception) { } //引用委托函数。 IEnumerable <ModelMaterial> expr_MaterialSet2 = documentAndMaterialIdToExportedMaterial.Values; Func <ModelMaterial, string> TexturePath2; if ((TexturePath2 = Inner.TexturePath2) == null) { TexturePath2 = (Inner.TexturePath2 = new Func <ModelMaterial, string>(Inner.tools.GetTexturePath2)); } //迭代非重复贴图路径集合。若不为空就把贴图文件夹所在绝对路径加上格式化后的文件名及后缀。 foreach (string current in expr_MaterialSet2.Select(TexturePath2).Distinct()) { if (!(current == "")) { string text2 = text + "\\" + CleanPath(Path.GetFileName(current), options); //若指定文件text2不存在,那么就尝试将current中的文件复制到text2中。 if (!File.Exists(text2)) { try { File.Copy(current, text2); } catch (Exception) { } } } } }
internal void MakeTexturePathsRelative(Dictionary <Tuple <Document, ElementId>, ModelMaterial> documentAndMaterialIdToExportedMaterial, ExportingOptions options) { IEnumerable <ModelMaterial> expr_MaterialSet3 = documentAndMaterialIdToExportedMaterial.Values; Func <ModelMaterial, bool> IsValidTexturePath; if ((IsValidTexturePath = Inner.mIsValidTexturePath) == null) { IsValidTexturePath = (Inner.mIsValidTexturePath = new Func <ModelMaterial, bool>(Inner.tools.IsValidTexturePath)); } foreach (ModelMaterial current in expr_MaterialSet3.Where(IsValidTexturePath)) { current.TexturePath = "textures\\" + this.CleanPath(Path.GetFileName(current.TexturePath), options); } }