初步完成导出,待优化顶点
This commit is contained in:
parent
06a8c36d6b
commit
e5e28afc3f
1
20210129/demo/res/Test.json
Normal file
1
20210129/demo/res/Test.json
Normal file
File diff suppressed because one or more lines are too long
1059
20210129/doc/zxq/NwGeoExporter/Installer/Installer.vdproj
Normal file
1059
20210129/doc/zxq/NwGeoExporter/Installer/Installer.vdproj
Normal file
File diff suppressed because it is too large
Load Diff
29
20210129/doc/zxq/NwGeoExporter/NwGeoExporter.sln
Normal file
29
20210129/doc/zxq/NwGeoExporter/NwGeoExporter.sln
Normal file
@ -0,0 +1,29 @@
|
|||||||
|
|
||||||
|
Microsoft Visual Studio Solution File, Format Version 12.00
|
||||||
|
# Visual Studio Version 16
|
||||||
|
VisualStudioVersion = 16.0.30320.27
|
||||||
|
MinimumVisualStudioVersion = 10.0.40219.1
|
||||||
|
Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "NwGeoExporter", "NwGeoExporter\NwGeoExporter.csproj", "{7EC625E4-E75B-40C5-83A4-407D427B74CE}"
|
||||||
|
EndProject
|
||||||
|
Project("{54435603-DBB4-11D2-8724-00A0C9A8B90C}") = "Installer", "Installer\Installer.vdproj", "{9BAC4FE1-B316-41B9-B908-5981C2477A3F}"
|
||||||
|
EndProject
|
||||||
|
Global
|
||||||
|
GlobalSection(SolutionConfigurationPlatforms) = preSolution
|
||||||
|
Debug|Any CPU = Debug|Any CPU
|
||||||
|
Release|Any CPU = Release|Any CPU
|
||||||
|
EndGlobalSection
|
||||||
|
GlobalSection(ProjectConfigurationPlatforms) = postSolution
|
||||||
|
{7EC625E4-E75B-40C5-83A4-407D427B74CE}.Debug|Any CPU.ActiveCfg = Debug|Any CPU
|
||||||
|
{7EC625E4-E75B-40C5-83A4-407D427B74CE}.Debug|Any CPU.Build.0 = Debug|Any CPU
|
||||||
|
{7EC625E4-E75B-40C5-83A4-407D427B74CE}.Release|Any CPU.ActiveCfg = Release|Any CPU
|
||||||
|
{7EC625E4-E75B-40C5-83A4-407D427B74CE}.Release|Any CPU.Build.0 = Release|Any CPU
|
||||||
|
{9BAC4FE1-B316-41B9-B908-5981C2477A3F}.Debug|Any CPU.ActiveCfg = Debug
|
||||||
|
{9BAC4FE1-B316-41B9-B908-5981C2477A3F}.Release|Any CPU.ActiveCfg = Release
|
||||||
|
EndGlobalSection
|
||||||
|
GlobalSection(SolutionProperties) = preSolution
|
||||||
|
HideSolutionNode = FALSE
|
||||||
|
EndGlobalSection
|
||||||
|
GlobalSection(ExtensibilityGlobals) = postSolution
|
||||||
|
SolutionGuid = {AFF13710-5A2E-4029-8150-67359B2AF996}
|
||||||
|
EndGlobalSection
|
||||||
|
EndGlobal
|
@ -0,0 +1,60 @@
|
|||||||
|
using System;
|
||||||
|
using System.Collections.Generic;
|
||||||
|
using System.Linq;
|
||||||
|
using System.Text;
|
||||||
|
using System.Threading.Tasks;
|
||||||
|
using Autodesk.Navisworks.Api.Interop.ComApi;
|
||||||
|
using NwGeoExporter.Models;
|
||||||
|
using NwGeoExporter.NwUtils;
|
||||||
|
|
||||||
|
namespace NwGeoExporter
|
||||||
|
{
|
||||||
|
public class CustomExporter : InwSimplePrimitivesCB
|
||||||
|
{
|
||||||
|
private TransformM transform3D;
|
||||||
|
|
||||||
|
public CustomExporter()
|
||||||
|
{
|
||||||
|
Triangles = new List<Triangle>();
|
||||||
|
}
|
||||||
|
|
||||||
|
public CustomExporter(TransformM transform3D):this()
|
||||||
|
{
|
||||||
|
this.transform3D = transform3D;
|
||||||
|
}
|
||||||
|
|
||||||
|
public List<Triangle> Triangles { get; set; }
|
||||||
|
|
||||||
|
public void Triangle(InwSimpleVertex v1, InwSimpleVertex v2, InwSimpleVertex v3)
|
||||||
|
{
|
||||||
|
var vertices = new PointM[]
|
||||||
|
{
|
||||||
|
transform3D.OfPoint(new PointM(v1)),
|
||||||
|
transform3D.OfPoint(new PointM(v2)),
|
||||||
|
transform3D.OfPoint(new PointM(v3)),
|
||||||
|
};
|
||||||
|
var normals = new VectorM[]
|
||||||
|
{
|
||||||
|
new VectorM(v1),
|
||||||
|
new VectorM(v2),
|
||||||
|
new VectorM(v3),
|
||||||
|
};
|
||||||
|
//Triangles.Add(new Triangle(v1,v2,v3));
|
||||||
|
Triangles.Add(new Triangle(normals,vertices));
|
||||||
|
}
|
||||||
|
|
||||||
|
public void Line(InwSimpleVertex v1, InwSimpleVertex v2)
|
||||||
|
{
|
||||||
|
|
||||||
|
}
|
||||||
|
|
||||||
|
public void Point(InwSimpleVertex v1)
|
||||||
|
{
|
||||||
|
}
|
||||||
|
|
||||||
|
public void SnapPoint(InwSimpleVertex v1)
|
||||||
|
{
|
||||||
|
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
@ -0,0 +1,72 @@
|
|||||||
|
using Autodesk.Navisworks.Api;
|
||||||
|
using Newtonsoft.Json;
|
||||||
|
using NwGeoExporter.NwEx;
|
||||||
|
using System;
|
||||||
|
using System.Collections.Generic;
|
||||||
|
using System.Linq;
|
||||||
|
using System.Text;
|
||||||
|
using System.Threading.Tasks;
|
||||||
|
|
||||||
|
namespace NwGeoExporter.Models
|
||||||
|
{
|
||||||
|
public class Instance
|
||||||
|
{
|
||||||
|
/// <summary>
|
||||||
|
/// 构件ID
|
||||||
|
/// </summary>
|
||||||
|
public string id { get; set; }
|
||||||
|
|
||||||
|
/// <summary>
|
||||||
|
/// 转换
|
||||||
|
/// </summary>
|
||||||
|
[JsonIgnore]
|
||||||
|
public TransformM Transform { get; set; }
|
||||||
|
|
||||||
|
///// <summary>
|
||||||
|
///// 转换-序列化(列主序)
|
||||||
|
///// </summary>
|
||||||
|
//public double[] transform
|
||||||
|
//{
|
||||||
|
// get
|
||||||
|
// {
|
||||||
|
// return new double[]
|
||||||
|
// {
|
||||||
|
// Transform.BasicX.X,Transform.BasicX.Y,Transform.BasicX.Z,0
|
||||||
|
// ,Transform.BasicY.X,Transform.BasicY.Y,Transform.BasicY.Z,0
|
||||||
|
// ,Transform.BasicZ.X,Transform.BasicZ.Y,Transform.BasicZ.Z,0
|
||||||
|
// ,Transform.Origin.X,Transform.Origin.Y,Transform.Origin.Z,1
|
||||||
|
// };
|
||||||
|
// }
|
||||||
|
//}
|
||||||
|
/// <summary>
|
||||||
|
/// 转换-序列化(行主序)
|
||||||
|
/// </summary>
|
||||||
|
public double[] transform
|
||||||
|
{
|
||||||
|
get
|
||||||
|
{
|
||||||
|
return new double[]
|
||||||
|
{
|
||||||
|
Transform.BasicX.X,Transform.BasicX.Y,Transform.BasicX.Z,0
|
||||||
|
,Transform.BasicY.X,Transform.BasicY.Y,Transform.BasicY.Z,0
|
||||||
|
,Transform.BasicZ.X,Transform.BasicZ.Y,Transform.BasicZ.Z,0
|
||||||
|
,Transform.Origin.X,Transform.Origin.Y,Transform.Origin.Z,1
|
||||||
|
};
|
||||||
|
}
|
||||||
|
}
|
||||||
|
/// <summary>
|
||||||
|
/// 是否可见
|
||||||
|
/// </summary>
|
||||||
|
public double visible { get; set; }
|
||||||
|
|
||||||
|
/// <summary>
|
||||||
|
/// 三角面片索引
|
||||||
|
/// </summary>
|
||||||
|
public int mesh { get; set; }
|
||||||
|
|
||||||
|
/// <summary>
|
||||||
|
/// 构件信息
|
||||||
|
/// </summary>
|
||||||
|
public Dictionary<string, string> info { get; set; }
|
||||||
|
}
|
||||||
|
}
|
@ -0,0 +1,46 @@
|
|||||||
|
using System;
|
||||||
|
using System.Collections.Generic;
|
||||||
|
using System.Linq;
|
||||||
|
using System.Text;
|
||||||
|
using System.Threading.Tasks;
|
||||||
|
|
||||||
|
namespace NwGeoExporter.Models
|
||||||
|
{
|
||||||
|
public class Material
|
||||||
|
{
|
||||||
|
/// <summary>
|
||||||
|
/// 十六进制颜色
|
||||||
|
/// </summary>
|
||||||
|
public string color { get; set; }
|
||||||
|
|
||||||
|
/// <summary>
|
||||||
|
/// 透明度
|
||||||
|
/// </summary>
|
||||||
|
public double transparment { get; set; }
|
||||||
|
|
||||||
|
public Material()
|
||||||
|
{
|
||||||
|
|
||||||
|
}
|
||||||
|
|
||||||
|
public Material(string color, double transparment)
|
||||||
|
{
|
||||||
|
this.color = color;
|
||||||
|
this.transparment = transparment;
|
||||||
|
|
||||||
|
}
|
||||||
|
|
||||||
|
public override bool Equals(object obj)
|
||||||
|
{
|
||||||
|
if (obj is Material mat)
|
||||||
|
{
|
||||||
|
return mat.color == color && mat.transparment == transparment;
|
||||||
|
}
|
||||||
|
return true;
|
||||||
|
}
|
||||||
|
public override int GetHashCode()
|
||||||
|
{
|
||||||
|
return 0;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
114
20210129/doc/zxq/NwGeoExporter/NwGeoExporter/Models/Mesh.cs
Normal file
114
20210129/doc/zxq/NwGeoExporter/NwGeoExporter/Models/Mesh.cs
Normal file
@ -0,0 +1,114 @@
|
|||||||
|
using Autodesk.Navisworks.Api.Interop.ComApi;
|
||||||
|
using Newtonsoft.Json;
|
||||||
|
using NwGeoExporter.NwEx;
|
||||||
|
using System;
|
||||||
|
using System.Collections.Generic;
|
||||||
|
using System.Linq;
|
||||||
|
using System.Text;
|
||||||
|
using System.Threading.Tasks;
|
||||||
|
|
||||||
|
namespace NwGeoExporter.Models
|
||||||
|
{
|
||||||
|
public class Mesh
|
||||||
|
{
|
||||||
|
/// <summary>
|
||||||
|
/// 顶点数组-序列化数据
|
||||||
|
/// </summary>
|
||||||
|
public double[] vertices { get => VerticeList.SelectMany(x => new List<double> { x.X.Feet2Mm(), x.Y.Feet2Mm(), x.Z.Feet2Mm() }).ToArray(); }
|
||||||
|
//public double[] vertices { get => VerticeList.SelectMany(x => new List<double> { x.X, x.Y, x.Z }).ToArray(); }
|
||||||
|
/// <summary>
|
||||||
|
/// 顶点索引-序列化数据
|
||||||
|
/// </summary>
|
||||||
|
public int[] indices { get => IndiceList.ToArray(); }
|
||||||
|
|
||||||
|
/// <summary>
|
||||||
|
/// 顶点法向-序列化数据
|
||||||
|
/// </summary>
|
||||||
|
public double[] normals { get => NormalList.SelectMany(x => new List<double> { x.X, x.Y, x.Z }).ToArray(); }
|
||||||
|
|
||||||
|
/// <summary>
|
||||||
|
/// 顶点集合
|
||||||
|
/// </summary>
|
||||||
|
[JsonIgnore]
|
||||||
|
public List<PointM> VerticeList { get; set; }
|
||||||
|
|
||||||
|
/// <summary>
|
||||||
|
/// 顶点法线
|
||||||
|
/// </summary>
|
||||||
|
[JsonIgnore]
|
||||||
|
public List<VectorM> NormalList { get; set; }
|
||||||
|
|
||||||
|
/// <summary>
|
||||||
|
/// 顶点索引
|
||||||
|
/// </summary>
|
||||||
|
[JsonIgnore]
|
||||||
|
public List<int> IndiceList { get; set; }
|
||||||
|
|
||||||
|
/// <summary>
|
||||||
|
/// 材质索引
|
||||||
|
/// </summary>
|
||||||
|
public int material { get; set; }
|
||||||
|
|
||||||
|
public Mesh(int materialIndex)
|
||||||
|
{
|
||||||
|
VerticeList = new List<PointM>();
|
||||||
|
NormalList = new List<VectorM>();
|
||||||
|
IndiceList = new List<int>();
|
||||||
|
material = materialIndex;
|
||||||
|
}
|
||||||
|
|
||||||
|
public Mesh(IEnumerable<Triangle> triangles, int materialIndex) : this(materialIndex)
|
||||||
|
{
|
||||||
|
this.AddTriangles(triangles);
|
||||||
|
|
||||||
|
}
|
||||||
|
public Mesh(Triangle triangle, int materialIndex) : this(materialIndex)
|
||||||
|
{
|
||||||
|
this.AddTriangle(triangle);
|
||||||
|
}
|
||||||
|
|
||||||
|
public void AddTriangle(Triangle triangle)
|
||||||
|
{
|
||||||
|
for (int i = 0; i < triangle.Vertices.Length; i++)
|
||||||
|
{
|
||||||
|
// bool isHandle = false;
|
||||||
|
// for (int j = 0; j < VerticeList.Count; j++)
|
||||||
|
// {
|
||||||
|
// if (VerticeList[j] == triangle.vertices[i])
|
||||||
|
// {
|
||||||
|
// //拿到索引集合中与当前顶点值一样的索引
|
||||||
|
// List<int> indexList = IndiceList.FindIndexs(x => x == j);
|
||||||
|
|
||||||
|
// //TODO:考虑多个的情况
|
||||||
|
// //第几个需要跟当前顶点法向进行平均
|
||||||
|
// int index = indexList.FindIndex(x => NormalList[x]
|
||||||
|
// .AngelTo(triangle.normals[i]).ToAngle() - 90 > 0.1);
|
||||||
|
// //有遇到顶点法线平均
|
||||||
|
// if (index != -1)
|
||||||
|
// {
|
||||||
|
// NormalList[j] = (triangle.normals[i] + NormalList[j]).Normalize();
|
||||||
|
// isHandle = true;
|
||||||
|
// break;
|
||||||
|
// }
|
||||||
|
// }
|
||||||
|
// }
|
||||||
|
// if (!isHandle)
|
||||||
|
// {
|
||||||
|
//添加顶点以及顶点法向以及对应的索引
|
||||||
|
VerticeList.Add(triangle.Vertices[i]);
|
||||||
|
NormalList.Add(triangle.Normals[i]);
|
||||||
|
IndiceList.Add(VerticeList.Count - 1);
|
||||||
|
}
|
||||||
|
//}
|
||||||
|
}
|
||||||
|
|
||||||
|
public void AddTriangles(IEnumerable<Triangle> triangles)
|
||||||
|
{
|
||||||
|
foreach (var triangle in triangles)
|
||||||
|
{
|
||||||
|
this.AddTriangle(triangle);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
}
|
||||||
|
}
|
@ -0,0 +1,31 @@
|
|||||||
|
using System;
|
||||||
|
using System.Collections.Generic;
|
||||||
|
using System.Linq;
|
||||||
|
using System.Text;
|
||||||
|
using System.Threading.Tasks;
|
||||||
|
|
||||||
|
namespace NwGeoExporter.Models
|
||||||
|
{
|
||||||
|
public class NwModel
|
||||||
|
{
|
||||||
|
public Instance[] instances { get; set; }
|
||||||
|
|
||||||
|
|
||||||
|
public Mesh[] meshes { get; set; }
|
||||||
|
|
||||||
|
|
||||||
|
public Material[] materials { get; set; }
|
||||||
|
|
||||||
|
public NwModel()
|
||||||
|
{
|
||||||
|
|
||||||
|
}
|
||||||
|
|
||||||
|
public NwModel(List<Instance> instanceList, List<Mesh> meshList, List<Material> materailList)
|
||||||
|
{
|
||||||
|
instances = instanceList.ToArray();
|
||||||
|
meshes = meshList.ToArray();
|
||||||
|
materials = materailList.ToArray();
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
@ -0,0 +1,65 @@
|
|||||||
|
using Autodesk.Navisworks.Api.Interop.ComApi;
|
||||||
|
using NwGeoExporter.NwEx;
|
||||||
|
using System;
|
||||||
|
using System.Collections.Generic;
|
||||||
|
using System.Linq;
|
||||||
|
using System.Text;
|
||||||
|
using System.Threading.Tasks;
|
||||||
|
|
||||||
|
namespace NwGeoExporter.Models
|
||||||
|
{
|
||||||
|
public class PointM
|
||||||
|
{
|
||||||
|
public double X { get; private set; }
|
||||||
|
|
||||||
|
public double Y { get; private set; }
|
||||||
|
|
||||||
|
public double Z { get; private set; }
|
||||||
|
|
||||||
|
public PointM()
|
||||||
|
{
|
||||||
|
X = 0;
|
||||||
|
Y = 0;
|
||||||
|
Z = 0;
|
||||||
|
}
|
||||||
|
|
||||||
|
public PointM(double x, double y, double z)
|
||||||
|
{
|
||||||
|
X = x;
|
||||||
|
Y = y;
|
||||||
|
Z = z;
|
||||||
|
}
|
||||||
|
|
||||||
|
public PointM(InwSimpleVertex v)
|
||||||
|
{
|
||||||
|
Array array_v = (Array)(object)v.coord;
|
||||||
|
X = (float)array_v.GetValue(1);
|
||||||
|
Y = (float)array_v.GetValue(2);
|
||||||
|
Z = (float)array_v.GetValue(3);
|
||||||
|
}
|
||||||
|
|
||||||
|
public override bool Equals(object obj)
|
||||||
|
{
|
||||||
|
if (obj is PointM pm)
|
||||||
|
{
|
||||||
|
if (pm.X.Round(6) == X.Round(6) && pm.Y.Round(6) == Y.Round(6) && pm.Z.Round(6) == Z.Round(6))
|
||||||
|
return true;
|
||||||
|
}
|
||||||
|
return false;
|
||||||
|
}
|
||||||
|
public override int GetHashCode()
|
||||||
|
{
|
||||||
|
return 0;
|
||||||
|
}
|
||||||
|
|
||||||
|
public static bool operator ==(PointM pm1, PointM pm2)
|
||||||
|
{
|
||||||
|
return pm1.Equals(pm2);
|
||||||
|
}
|
||||||
|
public static bool operator !=(PointM pm1, PointM pm2)
|
||||||
|
{
|
||||||
|
return !pm1.Equals(pm2);
|
||||||
|
}
|
||||||
|
|
||||||
|
}
|
||||||
|
}
|
@ -0,0 +1,74 @@
|
|||||||
|
using Autodesk.Navisworks.Api;
|
||||||
|
using Autodesk.Navisworks.Api.Interop.ComApi;
|
||||||
|
using System;
|
||||||
|
using System.Collections.Generic;
|
||||||
|
using System.Linq;
|
||||||
|
using System.Text;
|
||||||
|
using System.Threading.Tasks;
|
||||||
|
using NwGeoExporter.NwEx;
|
||||||
|
|
||||||
|
namespace NwGeoExporter.Models
|
||||||
|
{
|
||||||
|
public class TransformM
|
||||||
|
{
|
||||||
|
public VectorM BasicX { get; set; }
|
||||||
|
public VectorM BasicY { get; set; }
|
||||||
|
public VectorM BasicZ { get; set; }
|
||||||
|
public PointM Origin { get; set; }
|
||||||
|
|
||||||
|
public static TransformM Identify
|
||||||
|
{
|
||||||
|
get =>
|
||||||
|
new TransformM
|
||||||
|
{
|
||||||
|
BasicX = VectorM.BasicX,
|
||||||
|
BasicY = VectorM.BasicY,
|
||||||
|
BasicZ = VectorM.BasicZ,
|
||||||
|
Origin = new PointM(),
|
||||||
|
};
|
||||||
|
}
|
||||||
|
private InwLTransform3f3 inwTransform;
|
||||||
|
|
||||||
|
private TransformM()
|
||||||
|
{
|
||||||
|
|
||||||
|
}
|
||||||
|
/// <summary>
|
||||||
|
/// 将NW的列主序转换变成自定义的转换
|
||||||
|
/// </summary>
|
||||||
|
/// <param name="inwTransform"></param>
|
||||||
|
public TransformM(InwLTransform3f3 inwTransform)
|
||||||
|
{
|
||||||
|
double[] matrixElements = ((Array)(object)inwTransform.Matrix).ToArray<double>();
|
||||||
|
BasicX = new VectorM(matrixElements[0], matrixElements[1], matrixElements[2]);
|
||||||
|
BasicY = new VectorM(matrixElements[4], matrixElements[5], matrixElements[6]);
|
||||||
|
BasicZ = new VectorM(matrixElements[8], matrixElements[9], matrixElements[10]);
|
||||||
|
Origin = new PointM(matrixElements[12], matrixElements[13], matrixElements[14]);
|
||||||
|
this.inwTransform = inwTransform;
|
||||||
|
}
|
||||||
|
public PointM OfPoint(PointM point)
|
||||||
|
{
|
||||||
|
double[] matrixElements = ((Array)(object)inwTransform.Matrix).ToArray<double>();
|
||||||
|
double x = point.X;
|
||||||
|
double y = point.Y;
|
||||||
|
double z = point.Z;
|
||||||
|
double w = matrixElements[3] * x + matrixElements[7] * y + matrixElements[11] * z + matrixElements[15];
|
||||||
|
return new PointM(
|
||||||
|
(matrixElements[0] * x + matrixElements[4] * y + matrixElements[8] * z + matrixElements[12]) / w,
|
||||||
|
(matrixElements[1] * x + matrixElements[5] * y + matrixElements[9] * z + matrixElements[13]) / w,
|
||||||
|
(matrixElements[2] * x + matrixElements[6] * y + matrixElements[10] * z + matrixElements[14]) / w);
|
||||||
|
}
|
||||||
|
//public PointM OfPoint(PointM point)
|
||||||
|
//{
|
||||||
|
// double x = point.X;
|
||||||
|
// double y = point.Y;
|
||||||
|
// double z = point.Z;
|
||||||
|
// return
|
||||||
|
// new PointM(
|
||||||
|
// BasicX.X * x + BasicY.X * y + BasicZ.X * z + Origin.X,
|
||||||
|
// BasicX.Y * x + BasicY.Y * y + BasicZ.Y * z + Origin.Y,
|
||||||
|
// BasicX.Z * x + BasicY.Z * y + BasicZ.Z * z + Origin.Z
|
||||||
|
// );
|
||||||
|
//}
|
||||||
|
}
|
||||||
|
}
|
@ -0,0 +1,39 @@
|
|||||||
|
using Autodesk.Navisworks.Api.Interop.ComApi;
|
||||||
|
using System;
|
||||||
|
using System.Collections.Generic;
|
||||||
|
using System.Linq;
|
||||||
|
using System.Text;
|
||||||
|
using System.Threading.Tasks;
|
||||||
|
|
||||||
|
namespace NwGeoExporter.Models
|
||||||
|
{
|
||||||
|
public class Triangle
|
||||||
|
{
|
||||||
|
public Triangle()
|
||||||
|
{
|
||||||
|
Vertices = new PointM[3];
|
||||||
|
Normals = new VectorM[3];
|
||||||
|
}
|
||||||
|
|
||||||
|
public Triangle(VectorM[] normals,PointM[] vertices)
|
||||||
|
{
|
||||||
|
Vertices = vertices;
|
||||||
|
Normals = normals;
|
||||||
|
}
|
||||||
|
|
||||||
|
public Triangle(InwSimpleVertex v1, InwSimpleVertex v2, InwSimpleVertex v3):this()
|
||||||
|
{
|
||||||
|
//点
|
||||||
|
Vertices[0] = new PointM(v1);
|
||||||
|
Vertices[1] = new PointM(v2);
|
||||||
|
Vertices[2] = new PointM(v3);
|
||||||
|
//法向
|
||||||
|
Normals[0] = new VectorM(v1);
|
||||||
|
Normals[1] = new VectorM(v2);
|
||||||
|
Normals[2] = new VectorM(v3);
|
||||||
|
}
|
||||||
|
|
||||||
|
public PointM[] Vertices { get; private set; }
|
||||||
|
public VectorM[] Normals { get; private set; }
|
||||||
|
}
|
||||||
|
}
|
@ -0,0 +1,91 @@
|
|||||||
|
using Autodesk.Navisworks.Api.Interop.ComApi;
|
||||||
|
using Newtonsoft.Json;
|
||||||
|
using NwGeoExporter.NwEx;
|
||||||
|
using System;
|
||||||
|
using System.Collections.Generic;
|
||||||
|
using System.Linq;
|
||||||
|
using System.Text;
|
||||||
|
using System.Threading.Tasks;
|
||||||
|
|
||||||
|
namespace NwGeoExporter.Models
|
||||||
|
{
|
||||||
|
public class VectorM
|
||||||
|
{
|
||||||
|
public double X { get; private set; }
|
||||||
|
|
||||||
|
public double Y { get; private set; }
|
||||||
|
|
||||||
|
public double Z { get; private set; }
|
||||||
|
|
||||||
|
private double _length;
|
||||||
|
|
||||||
|
public VectorM()
|
||||||
|
{
|
||||||
|
|
||||||
|
}
|
||||||
|
public VectorM(double x, double y, double z)
|
||||||
|
{
|
||||||
|
X = x;
|
||||||
|
Y = y;
|
||||||
|
Z = z;
|
||||||
|
_length = Math.Sqrt(X * X + Y * Y + Z * Z);
|
||||||
|
}
|
||||||
|
|
||||||
|
public VectorM(InwSimpleVertex v)
|
||||||
|
{
|
||||||
|
Array array = (Array)(object)v.normal;
|
||||||
|
X = (float)array.GetValue(1);
|
||||||
|
Y = (float)array.GetValue(2);
|
||||||
|
Z = (float)array.GetValue(3);
|
||||||
|
}
|
||||||
|
/// <summary>
|
||||||
|
/// 点积
|
||||||
|
/// </summary>
|
||||||
|
/// <param name="vetor"></param>
|
||||||
|
/// <returns></returns>
|
||||||
|
public double DotProduct(VectorM vetor)
|
||||||
|
{
|
||||||
|
return X * X + Y * Y + Z * Z;
|
||||||
|
}
|
||||||
|
/// <summary>
|
||||||
|
/// 0→PI夹角计算
|
||||||
|
/// </summary>
|
||||||
|
/// <param name="vetor"></param>
|
||||||
|
/// <returns></returns>
|
||||||
|
public double AngelTo(VectorM vetor)
|
||||||
|
{
|
||||||
|
return Math.Acos(DotProduct(vetor) / (_length * vetor._length));
|
||||||
|
}
|
||||||
|
|
||||||
|
/// <summary>
|
||||||
|
/// 向量单位化
|
||||||
|
/// </summary>
|
||||||
|
/// <returns></returns>
|
||||||
|
public VectorM Normalize()
|
||||||
|
{
|
||||||
|
return new VectorM(X / _length, Y / _length, Z / _length);
|
||||||
|
}
|
||||||
|
|
||||||
|
public static VectorM BasicX { get => new VectorM(1, 0, 0); }
|
||||||
|
public static VectorM BasicY { get => new VectorM(0, 1, 0); }
|
||||||
|
public static VectorM BasicZ { get => new VectorM(0, 0, 1); }
|
||||||
|
|
||||||
|
public static VectorM operator +(VectorM vetor1, VectorM vetor2)
|
||||||
|
{
|
||||||
|
return new VectorM(vetor1.X + vetor2.X, vetor1.Y + vetor2.Y, vetor1.Z + vetor2.Z);
|
||||||
|
}
|
||||||
|
public override bool Equals(object obj)
|
||||||
|
{
|
||||||
|
if (obj is VectorM pm)
|
||||||
|
{
|
||||||
|
if (pm.X.Round(6) == X.Round(6) && pm.Y.Round(6) == Y.Round(6) && pm.Z.Round(6) == Z.Round(6))
|
||||||
|
return true;
|
||||||
|
}
|
||||||
|
return false;
|
||||||
|
}
|
||||||
|
public override int GetHashCode()
|
||||||
|
{
|
||||||
|
return 0;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
@ -0,0 +1,67 @@
|
|||||||
|
using System;
|
||||||
|
using System.Collections.Generic;
|
||||||
|
using System.Linq;
|
||||||
|
using System.Text;
|
||||||
|
using System.Threading.Tasks;
|
||||||
|
|
||||||
|
namespace NwGeoExporter.NwEx
|
||||||
|
{
|
||||||
|
public static class IEnumerableEx
|
||||||
|
{
|
||||||
|
/// <summary>
|
||||||
|
///
|
||||||
|
/// </summary>
|
||||||
|
/// <typeparam name="T"></typeparam>
|
||||||
|
/// <param name="arr"></param>
|
||||||
|
/// <returns></returns>
|
||||||
|
public static T[] ToArray<T>(this Array arr)
|
||||||
|
{
|
||||||
|
T[] result = new T[arr.Length];
|
||||||
|
Array.Copy(arr, result, result.Length);
|
||||||
|
return result;
|
||||||
|
}
|
||||||
|
|
||||||
|
/// <summary>
|
||||||
|
/// 找到第一个索引
|
||||||
|
/// </summary>
|
||||||
|
/// <typeparam name="T"></typeparam>
|
||||||
|
/// <param name="array"></param>
|
||||||
|
/// <param name="func"></param>
|
||||||
|
/// <returns></returns>
|
||||||
|
public static int FindIndex<T>(this IEnumerable<T> array, Func<T, bool> func)
|
||||||
|
{
|
||||||
|
if (func == null) return -1;
|
||||||
|
for (int i = 0; i < array.Count(); i++)
|
||||||
|
{
|
||||||
|
var t = array.ElementAt(i);
|
||||||
|
if (func(t))
|
||||||
|
{
|
||||||
|
return i;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
return -1;
|
||||||
|
}
|
||||||
|
|
||||||
|
/// <summary>
|
||||||
|
/// 找到所有的索引
|
||||||
|
/// </summary>
|
||||||
|
/// <typeparam name="T"></typeparam>
|
||||||
|
/// <param name="array"></param>
|
||||||
|
/// <param name="func"></param>
|
||||||
|
/// <returns></returns>
|
||||||
|
public static List<int> FindIndexs<T>(this IEnumerable<T> array, Func<T, bool> func)
|
||||||
|
{
|
||||||
|
List<int> indexList = new List<int>();
|
||||||
|
if (func == null) return null;
|
||||||
|
for (int i = 0; i < array.Count(); i++)
|
||||||
|
{
|
||||||
|
var t = array.ElementAt(i);
|
||||||
|
if (func(t))
|
||||||
|
{
|
||||||
|
indexList.Add(i);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
return indexList.Count == 0 ? null : indexList;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
28
20210129/doc/zxq/NwGeoExporter/NwGeoExporter/NwEx/MathEx.cs
Normal file
28
20210129/doc/zxq/NwGeoExporter/NwGeoExporter/NwEx/MathEx.cs
Normal file
@ -0,0 +1,28 @@
|
|||||||
|
using Autodesk.Navisworks.Api;
|
||||||
|
using System;
|
||||||
|
using System.Collections.Generic;
|
||||||
|
using System.Linq;
|
||||||
|
using System.Text;
|
||||||
|
using System.Threading.Tasks;
|
||||||
|
|
||||||
|
namespace NwGeoExporter.NwEx
|
||||||
|
{
|
||||||
|
public static class MathEx
|
||||||
|
{
|
||||||
|
public static double Round(this double d,int count)
|
||||||
|
{
|
||||||
|
return Math.Round(d, count);
|
||||||
|
}
|
||||||
|
|
||||||
|
public static double ToAngle(this double rad)
|
||||||
|
{
|
||||||
|
return rad / Math.PI * 180;
|
||||||
|
}
|
||||||
|
|
||||||
|
public static double Feet2Mm(this double feet)
|
||||||
|
{
|
||||||
|
return UnitConversion.ScaleFactor(Units.Feet,Units.Millimeters)*feet;
|
||||||
|
}
|
||||||
|
|
||||||
|
}
|
||||||
|
}
|
@ -0,0 +1,22 @@
|
|||||||
|
using Autodesk.Navisworks.Api;
|
||||||
|
using System;
|
||||||
|
using System.Collections.Generic;
|
||||||
|
using System.Linq;
|
||||||
|
using System.Text;
|
||||||
|
using System.Threading.Tasks;
|
||||||
|
|
||||||
|
namespace NwGeoExporter.NwEx
|
||||||
|
{
|
||||||
|
public static class Vector3DEx
|
||||||
|
{
|
||||||
|
public static Vector3D SetZ(this Vector3D vector, double z = 0)
|
||||||
|
{
|
||||||
|
return new Vector3D(vector.X, vector.Y, z);
|
||||||
|
}
|
||||||
|
public static Vector3D AddZ(this Vector3D vector, double z)
|
||||||
|
{
|
||||||
|
return new Vector3D(vector.X, vector.Y, vector.Z + z);
|
||||||
|
}
|
||||||
|
|
||||||
|
}
|
||||||
|
}
|
170
20210129/doc/zxq/NwGeoExporter/NwGeoExporter/NwExporterPlugin.cs
Normal file
170
20210129/doc/zxq/NwGeoExporter/NwGeoExporter/NwExporterPlugin.cs
Normal file
@ -0,0 +1,170 @@
|
|||||||
|
using System;
|
||||||
|
using System.Collections.Generic;
|
||||||
|
using System.Linq;
|
||||||
|
using System.Text;
|
||||||
|
using System.Threading.Tasks;
|
||||||
|
using Autodesk.Navisworks.Api;
|
||||||
|
using Autodesk.Navisworks.Api.Plugins;
|
||||||
|
using ComBridge = Autodesk.Navisworks.Api.ComApi.ComApiBridge;
|
||||||
|
using COMApi = Autodesk.Navisworks.Api.Interop.ComApi;
|
||||||
|
using NwGeoExporter.NwUtils;
|
||||||
|
using Autodesk.Navisworks.Api.Interop.ComApi;
|
||||||
|
using NwGeoExporter.Models;
|
||||||
|
using System.Windows.Forms;
|
||||||
|
using System.IO;
|
||||||
|
using Application = Autodesk.Navisworks.Api.Application;
|
||||||
|
using System.Diagnostics;
|
||||||
|
using static NwGeoExporter.NwUtils.PropertyUtils;
|
||||||
|
using NwGeoExporter.NwEx;
|
||||||
|
|
||||||
|
namespace NwGeoExporter
|
||||||
|
{
|
||||||
|
#region NW Plugin
|
||||||
|
[Plugin("Nw导出", "uBIM")]
|
||||||
|
[AddInPlugin(AddInLocation.AddIn)]
|
||||||
|
public class NwExporterPlugin : AddInPlugin
|
||||||
|
{
|
||||||
|
|
||||||
|
public override int Execute(params string[] parameters)
|
||||||
|
{
|
||||||
|
//实例集合
|
||||||
|
List<Instance> instanceList = new List<Instance>();
|
||||||
|
|
||||||
|
//网格集合
|
||||||
|
List<Mesh> meshList = new List<Mesh>();
|
||||||
|
|
||||||
|
//材质集合
|
||||||
|
List<Material> materialList = new List<Material>();
|
||||||
|
|
||||||
|
//拿到所有的构件
|
||||||
|
Document doc = Application.ActiveDocument;
|
||||||
|
|
||||||
|
//获取项目树中的子项
|
||||||
|
var modelItemColl = ModelItemUtils.GetModelItems(doc);
|
||||||
|
|
||||||
|
//转换成选择集
|
||||||
|
COMApi.InwOpSelection selItemColl =
|
||||||
|
ComBridge.ToInwOpSelection(modelItemColl);
|
||||||
|
//当前索引
|
||||||
|
int index = 0;
|
||||||
|
foreach (COMApi.InwOaPath3 path in selItemColl.Paths())
|
||||||
|
{
|
||||||
|
//是否是可载入族
|
||||||
|
bool isInstance = ModelItemUtils.IsRevitInstance(modelItemColl[index].Parent.Parent);
|
||||||
|
|
||||||
|
#region 查找Mesh材质
|
||||||
|
//材质属性
|
||||||
|
var material = GetMaterial(modelItemColl[index].Parent);
|
||||||
|
//查找材质索引
|
||||||
|
int matIndex = materialList.FindIndex(x => x.Equals(material));
|
||||||
|
if (matIndex == -1)
|
||||||
|
{
|
||||||
|
materialList.Add(material);
|
||||||
|
matIndex = materialList.Count - 1;
|
||||||
|
}
|
||||||
|
#endregion
|
||||||
|
|
||||||
|
#region Revit元素属性
|
||||||
|
Dictionary<string, string> elemPropertyDict = new Dictionary<string, string>();
|
||||||
|
DataPropertyCollection elemPropertyColl = null;
|
||||||
|
if (isInstance)
|
||||||
|
{
|
||||||
|
elemPropertyColl = GetDataPropertys(modelItemColl[index].Parent.Parent, PropertyCategoryName.LcRevitData_Element);
|
||||||
|
}
|
||||||
|
else
|
||||||
|
{
|
||||||
|
elemPropertyColl = GetDataPropertys(modelItemColl[index].Parent, PropertyCategoryName.LcRevitData_Element);
|
||||||
|
}
|
||||||
|
//二级是系统族获取元素属性的方法
|
||||||
|
foreach (var elemProperty in elemPropertyColl)
|
||||||
|
{
|
||||||
|
if (!elemPropertyDict.ContainsKey(elemProperty.CombinedName.ToString()))
|
||||||
|
elemPropertyDict.Add(elemProperty.CombinedName.ToString(), GetValueString(elemProperty));
|
||||||
|
}
|
||||||
|
#endregion
|
||||||
|
|
||||||
|
#region 拿构件ID
|
||||||
|
string elemID = "";
|
||||||
|
DataPropertyCollection projectPropertyColl = null;
|
||||||
|
if (isInstance)
|
||||||
|
{
|
||||||
|
projectPropertyColl = GetDataPropertys(modelItemColl[index].Parent.Parent, PropertyCategoryName.LcOaNode);
|
||||||
|
}
|
||||||
|
else
|
||||||
|
{
|
||||||
|
projectPropertyColl = GetDataPropertys(modelItemColl[index].Parent, PropertyCategoryName.LcOaNode);
|
||||||
|
}
|
||||||
|
foreach (var projectProperty in projectPropertyColl)
|
||||||
|
{
|
||||||
|
if (projectProperty.Name == "LcOaNodeGuid")
|
||||||
|
{
|
||||||
|
elemID = GetValueString(projectProperty);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
#endregion
|
||||||
|
|
||||||
|
#region 获取Mesh
|
||||||
|
Mesh mesh = new Mesh(matIndex);
|
||||||
|
TransformM transform3D = null;
|
||||||
|
foreach (COMApi.InwOaFragment3 frag in path.Fragments())
|
||||||
|
{
|
||||||
|
//if (transform3D == null)
|
||||||
|
//{
|
||||||
|
InwLTransform3f3 localToWorld = (InwLTransform3f3)frag.GetLocalToWorldMatrix();
|
||||||
|
transform3D = new TransformM(localToWorld);
|
||||||
|
//}
|
||||||
|
CustomExporter customExporter = new CustomExporter(transform3D);
|
||||||
|
// generate the primitives
|
||||||
|
frag.GenerateSimplePrimitives(COMApi.nwEVertexProperty.eNORMAL, customExporter);
|
||||||
|
mesh.AddTriangles(customExporter.Triangles);
|
||||||
|
}
|
||||||
|
meshList.Add(mesh);
|
||||||
|
#endregion
|
||||||
|
|
||||||
|
#region 构建Instance对象
|
||||||
|
Instance currentInstance = new Instance()
|
||||||
|
{
|
||||||
|
id = elemID,
|
||||||
|
mesh = meshList.Count - 1,
|
||||||
|
Transform = TransformM.Identify,
|
||||||
|
visible = 1.0,
|
||||||
|
info = elemPropertyDict,
|
||||||
|
};
|
||||||
|
instanceList.Add(currentInstance);
|
||||||
|
index++;
|
||||||
|
#endregion
|
||||||
|
}
|
||||||
|
|
||||||
|
NwModel model = new NwModel(instanceList, meshList, materialList);
|
||||||
|
string json = JsonUtils.ObjectToJson(model);
|
||||||
|
while (true)
|
||||||
|
{
|
||||||
|
SaveFileDialog sfd = new SaveFileDialog();
|
||||||
|
try
|
||||||
|
{
|
||||||
|
sfd.Filter = "nw导出数据(*.json)|*.json";
|
||||||
|
sfd.FileName = "Test";
|
||||||
|
sfd.AddExtension = true;
|
||||||
|
sfd.RestoreDirectory = true;
|
||||||
|
DialogResult result = sfd.ShowDialog();
|
||||||
|
//点了保存按钮进入
|
||||||
|
if (result == DialogResult.OK)
|
||||||
|
{
|
||||||
|
//获得文件路径
|
||||||
|
string path = sfd.FileName;
|
||||||
|
File.WriteAllText(path, json);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
catch
|
||||||
|
{
|
||||||
|
MessageBox.Show($"{sfd.FileName}被占用,请重新选择!", "提示", MessageBoxButtons.OK);
|
||||||
|
continue;
|
||||||
|
}
|
||||||
|
break;
|
||||||
|
}
|
||||||
|
MessageBox.Show("导出成功。");
|
||||||
|
return 0;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
#endregion
|
||||||
|
}
|
@ -0,0 +1,85 @@
|
|||||||
|
<?xml version="1.0" encoding="utf-8"?>
|
||||||
|
<Project ToolsVersion="15.0" xmlns="http://schemas.microsoft.com/developer/msbuild/2003">
|
||||||
|
<Import Project="$(MSBuildExtensionsPath)\$(MSBuildToolsVersion)\Microsoft.Common.props" Condition="Exists('$(MSBuildExtensionsPath)\$(MSBuildToolsVersion)\Microsoft.Common.props')" />
|
||||||
|
<PropertyGroup>
|
||||||
|
<Configuration Condition=" '$(Configuration)' == '' ">Debug</Configuration>
|
||||||
|
<Platform Condition=" '$(Platform)' == '' ">AnyCPU</Platform>
|
||||||
|
<ProjectGuid>{7EC625E4-E75B-40C5-83A4-407D427B74CE}</ProjectGuid>
|
||||||
|
<OutputType>Library</OutputType>
|
||||||
|
<AppDesignerFolder>Properties</AppDesignerFolder>
|
||||||
|
<RootNamespace>NwGeoExporter</RootNamespace>
|
||||||
|
<AssemblyName>NwGeoExporter</AssemblyName>
|
||||||
|
<TargetFrameworkVersion>v4.5.2</TargetFrameworkVersion>
|
||||||
|
<FileAlignment>512</FileAlignment>
|
||||||
|
<Deterministic>true</Deterministic>
|
||||||
|
</PropertyGroup>
|
||||||
|
<PropertyGroup Condition=" '$(Configuration)|$(Platform)' == 'Debug|AnyCPU' ">
|
||||||
|
<DebugSymbols>true</DebugSymbols>
|
||||||
|
<DebugType>full</DebugType>
|
||||||
|
<Optimize>false</Optimize>
|
||||||
|
<OutputPath>bin\Debug\</OutputPath>
|
||||||
|
<DefineConstants>DEBUG;TRACE</DefineConstants>
|
||||||
|
<ErrorReport>prompt</ErrorReport>
|
||||||
|
<WarningLevel>4</WarningLevel>
|
||||||
|
</PropertyGroup>
|
||||||
|
<PropertyGroup Condition=" '$(Configuration)|$(Platform)' == 'Release|AnyCPU' ">
|
||||||
|
<DebugType>pdbonly</DebugType>
|
||||||
|
<Optimize>true</Optimize>
|
||||||
|
<OutputPath>bin\Release\</OutputPath>
|
||||||
|
<DefineConstants>TRACE</DefineConstants>
|
||||||
|
<ErrorReport>prompt</ErrorReport>
|
||||||
|
<WarningLevel>4</WarningLevel>
|
||||||
|
</PropertyGroup>
|
||||||
|
<ItemGroup>
|
||||||
|
<Reference Include="Autodesk.Navisworks.Api, Version=13.0.1240.52, Culture=neutral, PublicKeyToken=d85e58fa5af9b484, processorArchitecture=AMD64">
|
||||||
|
<SpecificVersion>False</SpecificVersion>
|
||||||
|
<HintPath>D:\Program Files\Autodesk\Navisworks Manage 2016\Autodesk.Navisworks.Api.dll</HintPath>
|
||||||
|
</Reference>
|
||||||
|
<Reference Include="Autodesk.Navisworks.ComApi, Version=13.0.1240.52, Culture=neutral, PublicKeyToken=d85e58fa5af9b484, processorArchitecture=AMD64">
|
||||||
|
<SpecificVersion>False</SpecificVersion>
|
||||||
|
<HintPath>D:\Program Files\Autodesk\Navisworks Manage 2016\Autodesk.Navisworks.ComApi.dll</HintPath>
|
||||||
|
</Reference>
|
||||||
|
<Reference Include="Autodesk.Navisworks.Interop.ComApi, Version=13.0.1240.52, Culture=neutral, PublicKeyToken=d85e58fa5af9b484, processorArchitecture=AMD64">
|
||||||
|
<SpecificVersion>False</SpecificVersion>
|
||||||
|
<EmbedInteropTypes>True</EmbedInteropTypes>
|
||||||
|
<HintPath>D:\Program Files\Autodesk\Navisworks Manage 2016\Autodesk.Navisworks.Interop.ComApi.dll</HintPath>
|
||||||
|
</Reference>
|
||||||
|
<Reference Include="NewtonSoft.Json">
|
||||||
|
<HintPath>D:\Program Files\Autodesk\Navisworks Manage 2016\Loaders\Rx\NewtonSoft.Json.dll</HintPath>
|
||||||
|
</Reference>
|
||||||
|
<Reference Include="System" />
|
||||||
|
<Reference Include="System.Core" />
|
||||||
|
<Reference Include="System.Windows.Forms" />
|
||||||
|
<Reference Include="System.Xml.Linq" />
|
||||||
|
<Reference Include="System.Data.DataSetExtensions" />
|
||||||
|
<Reference Include="Microsoft.CSharp" />
|
||||||
|
<Reference Include="System.Data" />
|
||||||
|
<Reference Include="System.Net.Http" />
|
||||||
|
<Reference Include="System.Xml" />
|
||||||
|
</ItemGroup>
|
||||||
|
<ItemGroup>
|
||||||
|
<Compile Include="CustomExporter.cs" />
|
||||||
|
<Compile Include="Models\Instance.cs" />
|
||||||
|
<Compile Include="Models\Material.cs" />
|
||||||
|
<Compile Include="Models\Mesh.cs" />
|
||||||
|
<Compile Include="Models\NwModel.cs" />
|
||||||
|
<Compile Include="Models\PointM.cs" />
|
||||||
|
<Compile Include="Models\TransformM.cs" />
|
||||||
|
<Compile Include="NwEx\Vector3DEx.cs" />
|
||||||
|
<Compile Include="Models\Triangle.cs" />
|
||||||
|
<Compile Include="Models\VectorM.cs" />
|
||||||
|
<Compile Include="NwExporterPlugin.cs" />
|
||||||
|
<Compile Include="NwEx\IEnumerableEx.cs" />
|
||||||
|
<Compile Include="NwEx\MathEx.cs" />
|
||||||
|
<Compile Include="NwUtils\JsonUtils.cs" />
|
||||||
|
<Compile Include="NwUtils\ModelUtils.cs" />
|
||||||
|
<Compile Include="NwUtils\PropertyUtils.cs" />
|
||||||
|
<Compile Include="Properties\AssemblyInfo.cs" />
|
||||||
|
</ItemGroup>
|
||||||
|
<ItemGroup>
|
||||||
|
<Content Include="PackageContents.xml">
|
||||||
|
<CopyToOutputDirectory>Always</CopyToOutputDirectory>
|
||||||
|
</Content>
|
||||||
|
</ItemGroup>
|
||||||
|
<Import Project="$(MSBuildToolsPath)\Microsoft.CSharp.targets" />
|
||||||
|
</Project>
|
@ -0,0 +1,17 @@
|
|||||||
|
using System;
|
||||||
|
using System.Collections.Generic;
|
||||||
|
using System.Linq;
|
||||||
|
using System.Text;
|
||||||
|
using System.Threading.Tasks;
|
||||||
|
using Newtonsoft.Json;
|
||||||
|
|
||||||
|
namespace NwGeoExporter.NwUtils
|
||||||
|
{
|
||||||
|
public static class JsonUtils
|
||||||
|
{
|
||||||
|
public static string ObjectToJson<T>(T t)
|
||||||
|
{
|
||||||
|
return JsonConvert.SerializeObject(t);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
@ -0,0 +1,43 @@
|
|||||||
|
using Autodesk.Navisworks.Api;
|
||||||
|
using Autodesk.Navisworks.Api.Interop.ComApi;
|
||||||
|
using System;
|
||||||
|
using System.Collections.Generic;
|
||||||
|
using System.Linq;
|
||||||
|
using System.Text;
|
||||||
|
using System.Threading.Tasks;
|
||||||
|
using ComBridge = Autodesk.Navisworks.Api.ComApi.ComApiBridge;
|
||||||
|
|
||||||
|
namespace NwGeoExporter.NwUtils
|
||||||
|
{
|
||||||
|
public static class ModelItemUtils
|
||||||
|
{
|
||||||
|
public static ModelItemCollection GetModelItems(Document doc)
|
||||||
|
{
|
||||||
|
var modelItemList = doc.Models.SelectMany(x => GetMostBasicModelItem(x.RootItem)).Where(x => x.HasGeometry).ToList();
|
||||||
|
ModelItemCollection modelItemCollection = new ModelItemCollection();
|
||||||
|
modelItemCollection.AddRange(modelItemList);
|
||||||
|
return modelItemCollection;
|
||||||
|
}
|
||||||
|
/// <summary>
|
||||||
|
/// 获取最底层的树节点
|
||||||
|
/// </summary>
|
||||||
|
/// <param name="modelItem"></param>
|
||||||
|
/// <returns></returns>
|
||||||
|
public static List<ModelItem> GetMostBasicModelItem(ModelItem modelItem)
|
||||||
|
{
|
||||||
|
if (modelItem.Children.Count() == 0)
|
||||||
|
{
|
||||||
|
return new List<ModelItem> { modelItem };
|
||||||
|
}
|
||||||
|
else
|
||||||
|
{
|
||||||
|
return modelItem.Children.SelectMany(x => GetMostBasicModelItem(x)).ToList();
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
public static bool IsRevitInstance(ModelItem item)
|
||||||
|
{
|
||||||
|
return item.ClassName == "LcRevitInstance";
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
@ -0,0 +1,157 @@
|
|||||||
|
using Autodesk.Navisworks.Api;
|
||||||
|
using NwGeoExporter.Models;
|
||||||
|
using System;
|
||||||
|
using System.Collections.Generic;
|
||||||
|
using System.Diagnostics;
|
||||||
|
using System.Linq;
|
||||||
|
using System.Text;
|
||||||
|
using System.Threading.Tasks;
|
||||||
|
|
||||||
|
namespace NwGeoExporter.NwUtils
|
||||||
|
{
|
||||||
|
public static class PropertyUtils
|
||||||
|
{
|
||||||
|
public enum PropertyCategoryName
|
||||||
|
{
|
||||||
|
/// <summary>
|
||||||
|
/// 项目
|
||||||
|
/// </summary>
|
||||||
|
LcOaNode,
|
||||||
|
|
||||||
|
/// <summary>
|
||||||
|
/// 变换
|
||||||
|
/// </summary>
|
||||||
|
LcOaExTrans,
|
||||||
|
|
||||||
|
/// <summary>
|
||||||
|
/// 材质
|
||||||
|
/// </summary>
|
||||||
|
LcOaExMaterial,
|
||||||
|
|
||||||
|
/// <summary>
|
||||||
|
/// Revit材质
|
||||||
|
/// </summary>
|
||||||
|
LcRevitMaterialProperties,
|
||||||
|
|
||||||
|
/// <summary>
|
||||||
|
/// AutoDesk材质
|
||||||
|
/// </summary>
|
||||||
|
LcOaProteinMaterialAttribute,
|
||||||
|
|
||||||
|
/// <summary>
|
||||||
|
/// 元素ID
|
||||||
|
/// </summary>
|
||||||
|
LcRevitId,
|
||||||
|
|
||||||
|
/// <summary>
|
||||||
|
/// 元素
|
||||||
|
/// </summary>
|
||||||
|
LcRevitData_Element,
|
||||||
|
//LcRevitData_Parameter(钢筋保护层 - 其他面)
|
||||||
|
//LcRevitData_Parameter(顶部标高)
|
||||||
|
//LcRevitData_Parameter(底部标高)
|
||||||
|
//LcRevitData_Parameter(创建的阶段)
|
||||||
|
//LcRevitData_Type(Revit 类型)
|
||||||
|
//LcOdpTimeLinerProperty(TimeLiner)
|
||||||
|
|
||||||
|
|
||||||
|
}
|
||||||
|
public static Material GetMaterial(ModelItem modelItem)
|
||||||
|
{
|
||||||
|
//材质属性
|
||||||
|
var propertyColl = GetDataPropertys(modelItem, PropertyCategoryName.LcRevitMaterialProperties);
|
||||||
|
string color = "#FF0000";
|
||||||
|
double transparency = 0;
|
||||||
|
foreach (var property in propertyColl)
|
||||||
|
{
|
||||||
|
if (property.Name == "revit_Color")
|
||||||
|
{
|
||||||
|
string colorString = GetValueString(property);
|
||||||
|
//分割
|
||||||
|
var byteArray = colorString.Split(new char[] { ',' }).Select(x => int.Parse(x)).ToList();
|
||||||
|
color = $"#{byteArray[0]:x0}{byteArray[1]:x0}{byteArray[2]:x0}";
|
||||||
|
}
|
||||||
|
else if (property.Name == "revit_Transparency")
|
||||||
|
{
|
||||||
|
transparency = property.Value.ToInt32() / 100.0;
|
||||||
|
}
|
||||||
|
Debug.WriteLine(property.CombinedName);
|
||||||
|
}
|
||||||
|
return new Material(color, transparency);
|
||||||
|
}
|
||||||
|
/// <summary>
|
||||||
|
/// 根据栏目名称获取对应的属性集合
|
||||||
|
/// </summary>
|
||||||
|
/// <param name="modelItem"></param>
|
||||||
|
/// <param name="pCatName"></param>
|
||||||
|
/// <returns></returns>
|
||||||
|
public static DataPropertyCollection GetDataPropertys(ModelItem modelItem, PropertyCategoryName pCatName)
|
||||||
|
{
|
||||||
|
PropertyCategoryCollection propertyCatCollection = modelItem.PropertyCategories;
|
||||||
|
string catName = Enum.GetName(pCatName.GetType(), (int)pCatName);
|
||||||
|
foreach (var propertyCat in propertyCatCollection)
|
||||||
|
{
|
||||||
|
if (propertyCat.Name == catName)
|
||||||
|
return propertyCat.Properties;
|
||||||
|
}
|
||||||
|
return new DataPropertyCollection();
|
||||||
|
}
|
||||||
|
|
||||||
|
/// <summary>
|
||||||
|
/// 识别属性值的类型并将其转成string类型
|
||||||
|
/// </summary>
|
||||||
|
/// <param name="dataProperty"></param>
|
||||||
|
/// <returns></returns>
|
||||||
|
public static string GetValueString(DataProperty dataProperty)
|
||||||
|
{
|
||||||
|
string valueString = "";
|
||||||
|
switch (dataProperty.Value.DataType)
|
||||||
|
{
|
||||||
|
case VariantDataType.Boolean:
|
||||||
|
valueString = dataProperty.Value.ToBoolean().ToString();
|
||||||
|
break;
|
||||||
|
case VariantDataType.None:
|
||||||
|
|
||||||
|
break;
|
||||||
|
case VariantDataType.Double:
|
||||||
|
valueString = dataProperty.Value.ToDouble().ToString();
|
||||||
|
break;
|
||||||
|
case VariantDataType.Int32:
|
||||||
|
valueString = dataProperty.Value.ToInt32().ToString();
|
||||||
|
break;
|
||||||
|
case VariantDataType.DisplayString:
|
||||||
|
valueString = dataProperty.Value.ToDisplayString();
|
||||||
|
break;
|
||||||
|
case VariantDataType.DateTime:
|
||||||
|
valueString = dataProperty.Value.ToDateTime().ToString();
|
||||||
|
break;
|
||||||
|
case VariantDataType.DoubleLength:
|
||||||
|
valueString = dataProperty.Value.ToDoubleLength().ToString();
|
||||||
|
break;
|
||||||
|
case VariantDataType.DoubleAngle:
|
||||||
|
valueString = dataProperty.Value.ToDoubleAngle().ToString();
|
||||||
|
break;
|
||||||
|
case VariantDataType.NamedConstant:
|
||||||
|
valueString = dataProperty.Value.ToNamedConstant().ToString();
|
||||||
|
break;
|
||||||
|
case VariantDataType.IdentifierString:
|
||||||
|
valueString = dataProperty.Value.ToIdentifierString();
|
||||||
|
break;
|
||||||
|
case VariantDataType.DoubleArea:
|
||||||
|
valueString = dataProperty.Value.ToDoubleArea().ToString();
|
||||||
|
break;
|
||||||
|
case VariantDataType.DoubleVolume:
|
||||||
|
valueString = dataProperty.Value.ToDoubleVolume().ToString();
|
||||||
|
break;
|
||||||
|
case VariantDataType.Point3D:
|
||||||
|
valueString = dataProperty.Value.ToPoint3D().ToString();
|
||||||
|
break;
|
||||||
|
case VariantDataType.Point2D:
|
||||||
|
valueString = dataProperty.Value.ToPoint2D().ToString();
|
||||||
|
break;
|
||||||
|
}
|
||||||
|
return valueString;
|
||||||
|
}
|
||||||
|
|
||||||
|
}
|
||||||
|
}
|
@ -0,0 +1,8 @@
|
|||||||
|
<?xml version="1.0" encoding="utf-8"?>
|
||||||
|
<ApplicationPackage>
|
||||||
|
<Components>
|
||||||
|
<RuntimeRequirements OS="Win64" Platform="NAVMAN" SeriesMin="Nw13" SeriesMax="Nw13" />
|
||||||
|
<ComponentEntry AppType="ManagedPlugin" ModuleName="./Contents/NwGeoExporter.dll">
|
||||||
|
</ComponentEntry>
|
||||||
|
</Components>
|
||||||
|
</ApplicationPackage>
|
@ -0,0 +1,36 @@
|
|||||||
|
using System.Reflection;
|
||||||
|
using System.Runtime.CompilerServices;
|
||||||
|
using System.Runtime.InteropServices;
|
||||||
|
|
||||||
|
// 有关程序集的一般信息由以下
|
||||||
|
// 控制。更改这些特性值可修改
|
||||||
|
// 与程序集关联的信息。
|
||||||
|
[assembly: AssemblyTitle("NwGeoExporter")]
|
||||||
|
[assembly: AssemblyDescription("")]
|
||||||
|
[assembly: AssemblyConfiguration("")]
|
||||||
|
[assembly: AssemblyCompany("")]
|
||||||
|
[assembly: AssemblyProduct("NwGeoExporter")]
|
||||||
|
[assembly: AssemblyCopyright("Copyright © 2021")]
|
||||||
|
[assembly: AssemblyTrademark("")]
|
||||||
|
[assembly: AssemblyCulture("")]
|
||||||
|
|
||||||
|
// 将 ComVisible 设置为 false 会使此程序集中的类型
|
||||||
|
//对 COM 组件不可见。如果需要从 COM 访问此程序集中的类型
|
||||||
|
//请将此类型的 ComVisible 特性设置为 true。
|
||||||
|
[assembly: ComVisible(false)]
|
||||||
|
|
||||||
|
// 如果此项目向 COM 公开,则下列 GUID 用于类型库的 ID
|
||||||
|
[assembly: Guid("7ec625e4-e75b-40c5-83a4-407d427b74ce")]
|
||||||
|
|
||||||
|
// 程序集的版本信息由下列四个值组成:
|
||||||
|
//
|
||||||
|
// 主版本
|
||||||
|
// 次版本
|
||||||
|
// 生成号
|
||||||
|
// 修订号
|
||||||
|
//
|
||||||
|
//可以指定所有这些值,也可以使用“生成号”和“修订号”的默认值
|
||||||
|
//通过使用 "*",如下所示:
|
||||||
|
// [assembly: AssemblyVersion("1.0.*")]
|
||||||
|
[assembly: AssemblyVersion("1.0.0.0")]
|
||||||
|
[assembly: AssemblyFileVersion("1.0.0.0")]
|
Loading…
Reference in New Issue
Block a user