568 lines
16 KiB
C#
568 lines
16 KiB
C#
using System;
|
|
using System.Collections;
|
|
using System.Collections.Generic;
|
|
using System.IO;
|
|
using System.Linq;
|
|
using System.Text.RegularExpressions;
|
|
using Autodesk.Revit.DB;
|
|
using Autodesk.Revit.DB.Visual;
|
|
using IFC_Revit_Interop.Utils;
|
|
using Microsoft.Win32;
|
|
|
|
namespace IFC_Revit_Interop
|
|
{
|
|
// Token: 0x0200000A RID: 10
|
|
internal class Rvt2Obj : IExportContext
|
|
{
|
|
// Token: 0x0600002A RID: 42 RVA: 0x00003B30 File Offset: 0x00001D30
|
|
public Rvt2Obj(Document doc, string objSavePath, string textureDir, int meshLod, Log log = null)
|
|
{
|
|
this.resultPath = objSavePath;
|
|
this.resultTexturePath = textureDir;
|
|
if (!Directory.Exists(this.resultTexturePath))
|
|
{
|
|
Directory.CreateDirectory(this.resultTexturePath);
|
|
}
|
|
this.m_doc = doc;
|
|
this.m_TransformationStack.Push(Transform.Identity);
|
|
this._precision = meshLod;
|
|
this.log = log;
|
|
}
|
|
|
|
// Token: 0x0600002B RID: 43 RVA: 0x00003BD4 File Offset: 0x00001DD4
|
|
public bool Start()
|
|
{
|
|
string fileNameWithoutExtension = Path.GetFileNameWithoutExtension(this.resultPath);
|
|
this.swObj = new StreamWriter(Path.GetDirectoryName(this.resultPath) + "\\" + fileNameWithoutExtension + ".obj");
|
|
this.swObj.Write("mtllib " + fileNameWithoutExtension + ".mtl\n");
|
|
this.swMtl = new StreamWriter(Path.GetDirectoryName(this.resultPath) + "\\" + fileNameWithoutExtension + ".mtl");
|
|
RegistryKey localMachine = Registry.LocalMachine;
|
|
RegistryKey registryKey = localMachine.OpenSubKey("SOFTWARE\\Wow6432Node\\Autodesk\\ADSKTextureLibrary\\1");
|
|
if (registryKey != null && int.Parse("2018") < 2020)
|
|
{
|
|
this.textureLibraryPath = registryKey.GetValue("LibraryPaths").ToString();
|
|
}
|
|
else
|
|
{
|
|
registryKey = localMachine.OpenSubKey("SOFTWARE\\Wow6432Node\\Autodesk\\ADSKTextureLibraryNew\\1");
|
|
if (registryKey != null)
|
|
{
|
|
string[] subKeyNames = registryKey.GetSubKeyNames();
|
|
if (subKeyNames.Length != 0)
|
|
{
|
|
registryKey = localMachine.OpenSubKey("SOFTWARE\\Wow6432Node\\Autodesk\\ADSKTextureLibraryNew\\1\\" + subKeyNames[0]);
|
|
}
|
|
if (registryKey != null)
|
|
{
|
|
this.textureLibraryPath = registryKey.GetValue("LibraryPaths").ToString();
|
|
}
|
|
}
|
|
}
|
|
if (string.IsNullOrEmpty(this.textureLibraryPath))
|
|
{
|
|
Log log = this.log;
|
|
if (log != null)
|
|
{
|
|
log.Write("Texture", "Revit Texture Library not found in Regedit.");
|
|
}
|
|
return false;
|
|
}
|
|
localMachine.Close();
|
|
registryKey.Close();
|
|
return true;
|
|
}
|
|
|
|
// Token: 0x0600002C RID: 44 RVA: 0x00003D10 File Offset: 0x00001F10
|
|
public RenderNodeAction OnViewBegin(ViewNode node)
|
|
{
|
|
node.LevelOfDetail = this._precision;
|
|
return 0;
|
|
}
|
|
|
|
// Token: 0x0600002D RID: 45 RVA: 0x00003D1F File Offset: 0x00001F1F
|
|
public RenderNodeAction OnLinkBegin(LinkNode node)
|
|
{
|
|
return (RenderNodeAction)1;
|
|
}
|
|
|
|
// Token: 0x0600002E RID: 46 RVA: 0x00003D24 File Offset: 0x00001F24
|
|
public RenderNodeAction OnElementBegin(ElementId elementId)
|
|
{
|
|
this.currentId = elementId;
|
|
this.elementPolyIndex = 0;
|
|
this.productTris[this.currentId.IntegerValue] = 0;
|
|
Utils_SendMessage.UpdateProgressUI(5, 90, (double)this.currentElementCount * 1.0 / (double)this.totalElementCount);
|
|
this.currentElementCount++;
|
|
return 0;
|
|
}
|
|
|
|
// Token: 0x0600002F RID: 47 RVA: 0x00003D88 File Offset: 0x00001F88
|
|
private Material GetElementTypeMaterial(ElementId eleId)
|
|
{
|
|
ElementType elementType = this.m_doc.GetElement(eleId) as ElementType;
|
|
if (elementType == null)
|
|
{
|
|
return null;
|
|
}
|
|
foreach (Parameter parameter in elementType.GetOrderedParameters())
|
|
{
|
|
if (parameter.StorageType == (StorageType)4)
|
|
{
|
|
Definition definition = parameter.Definition;
|
|
if (definition.ParameterGroup == (BuiltInParameterGroup)(-5000105) && definition.ParameterType == (ParameterType)9)
|
|
{
|
|
ElementId elementId = parameter.AsElementId();
|
|
if (-1 != elementId.IntegerValue)
|
|
{
|
|
return this.m_doc.GetElement(elementId) as Material;
|
|
}
|
|
break;
|
|
}
|
|
}
|
|
}
|
|
return null;
|
|
}
|
|
|
|
// Token: 0x06000030 RID: 48 RVA: 0x00003E38 File Offset: 0x00002038
|
|
private string GetMaterialTexturePath(Material m)
|
|
{
|
|
if (m == null)
|
|
{
|
|
return null;
|
|
}
|
|
ElementId appearanceAssetId = m.AppearanceAssetId;
|
|
if (appearanceAssetId != ElementId.InvalidElementId)
|
|
{
|
|
AppearanceAssetElement appearanceAssetElement = m.Document.GetElement(appearanceAssetId) as AppearanceAssetElement;
|
|
if (appearanceAssetElement != null)
|
|
{
|
|
Asset renderingAsset = appearanceAssetElement.GetRenderingAsset();
|
|
if (renderingAsset.Size == 0)
|
|
{
|
|
using (var enumerator = m.Document.Application.get_Assets((AssetType)4).ForwardIterator())
|
|
{
|
|
while (enumerator.MoveNext())
|
|
{
|
|
object obj = enumerator.Current;
|
|
Asset asset = (Asset)obj;
|
|
if (asset.Name == renderingAsset.Name && asset.LibraryName == renderingAsset.LibraryName)
|
|
{
|
|
return this.ParseAssetProperty(asset);
|
|
}
|
|
}
|
|
goto IL_00C3;
|
|
}
|
|
}
|
|
return this.ParseAssetProperty(renderingAsset);
|
|
}
|
|
}
|
|
IL_00C3:
|
|
return null;
|
|
}
|
|
|
|
// Token: 0x06000031 RID: 49 RVA: 0x00003F1C File Offset: 0x0000211C
|
|
public RenderNodeAction OnInstanceBegin(InstanceNode node)
|
|
{
|
|
this.m_TransformationStack.Push(this.m_TransformationStack.Peek().Multiply(node.GetTransform()));
|
|
return 0;
|
|
}
|
|
|
|
// Token: 0x06000032 RID: 50 RVA: 0x00003F40 File Offset: 0x00002140
|
|
public void OnMaterial(MaterialNode node)
|
|
{
|
|
if (this.currentMaterialId != node.MaterialId)
|
|
{
|
|
this.currentMaterialId = node.MaterialId;
|
|
if (this.materialIds.Contains(this.currentMaterialId))
|
|
{
|
|
return;
|
|
}
|
|
this.materialIds.Add(this.currentMaterialId);
|
|
this.currentColor = node.Color;
|
|
this.currentTransparency = 1.0 - node.Transparency;
|
|
this.swMtl.Write("\nnewmtl {0}\nka {1} {2} {3}\nkd {1} {2} {3}\nd {4}\n", new object[]
|
|
{
|
|
this.currentMaterialId.IntegerValue.ToString(),
|
|
((double)this.currentColor.Red / 256.0).ToString(),
|
|
((double)this.currentColor.Green / 256.0).ToString(),
|
|
((double)this.currentColor.Blue / 256.0).ToString(),
|
|
this.currentTransparency
|
|
});
|
|
if (node.HasOverriddenAppearance)
|
|
{
|
|
this.currentAsset = node.GetAppearanceOverride();
|
|
}
|
|
else
|
|
{
|
|
this.currentAsset = node.GetAppearance();
|
|
}
|
|
try
|
|
{
|
|
string text = this.ParseAssetProperty(this.GetTrueAsset(this.currentAsset));
|
|
if (text != null)
|
|
{
|
|
string text2 = Regex.Replace(Path.GetDirectoryName(text), "[^0-9]+", "");
|
|
this.textureName = Path.GetFileName(text).Replace(" ", "").Replace("&", "-")
|
|
.ToLower();
|
|
if (text2 != null && text2.Length > 0)
|
|
{
|
|
this.textureName = Path.GetFileNameWithoutExtension(this.textureName) + "_" + text2 + Path.GetExtension(this.textureName);
|
|
}
|
|
string text3 = Path.Combine(this.textureLibraryPath, text.Replace("/", "\\"));
|
|
if (File.Exists(text3))
|
|
{
|
|
this.swMtl.Write("map_Kd ./textures/" + this.textureName + "\n");
|
|
File.Copy(text3, Path.Combine(this.resultTexturePath, this.textureName), true);
|
|
}
|
|
}
|
|
}
|
|
catch (Exception)
|
|
{
|
|
}
|
|
}
|
|
}
|
|
|
|
// Token: 0x06000033 RID: 51 RVA: 0x0000417C File Offset: 0x0000237C
|
|
private Asset GetTrueAsset(Asset currentAsset)
|
|
{
|
|
if (currentAsset.Size == 0)
|
|
{
|
|
foreach (object obj in this.m_doc.Application.get_Assets((AssetType)4))
|
|
{
|
|
Asset asset = (Asset)obj;
|
|
if (asset.Name == currentAsset.Name && asset.LibraryName == currentAsset.LibraryName)
|
|
{
|
|
return asset;
|
|
}
|
|
}
|
|
return null;
|
|
}
|
|
return currentAsset;
|
|
}
|
|
|
|
// Token: 0x06000034 RID: 52 RVA: 0x00004210 File Offset: 0x00002410
|
|
public void OnLight(LightNode node)
|
|
{
|
|
}
|
|
|
|
// Token: 0x06000035 RID: 53 RVA: 0x00004212 File Offset: 0x00002412
|
|
public void OnRPC(RPCNode node)
|
|
{
|
|
}
|
|
|
|
// Token: 0x06000036 RID: 54 RVA: 0x00004214 File Offset: 0x00002414
|
|
public RenderNodeAction OnFaceBegin(FaceNode node)
|
|
{
|
|
return 0;
|
|
}
|
|
|
|
// Token: 0x06000037 RID: 55 RVA: 0x00004218 File Offset: 0x00002418
|
|
public void OnPolymesh(PolymeshTopology node)
|
|
{
|
|
TextWriter textWriter = this.swObj;
|
|
string[] array = new string[5];
|
|
array[0] = "g ";
|
|
array[1] = this.currentId.IntegerValue.ToString();
|
|
array[2] = "-";
|
|
int num = 3;
|
|
int integerValue = this.elementPolyIndex;
|
|
this.elementPolyIndex = integerValue + 1;
|
|
array[num] = integerValue.ToString();
|
|
array[4] = "\n";
|
|
textWriter.Write(string.Concat(array));
|
|
this.swObj.Write("usemtl " + this.currentMaterialId.IntegerValue.ToString() + "\n");
|
|
Transform currentTransform = this.m_TransformationStack.Peek();
|
|
IEnumerable<XYZ> enumerable = (from p in node.GetPoints()
|
|
select currentTransform.OfPoint(p)).ToList<XYZ>();
|
|
Dictionary<int, int> dictionary = this.productTris;
|
|
integerValue = this.currentId.IntegerValue;
|
|
dictionary[integerValue] += node.NumberOfPoints;
|
|
foreach (XYZ xyz in enumerable)
|
|
{
|
|
XYZ xyz2 = xyz * Rvt2Obj.feetToMM;
|
|
this.swObj.Write(string.Concat(new string[]
|
|
{
|
|
"v ",
|
|
xyz2.X.ToString(),
|
|
" ",
|
|
xyz2.Y.ToString(),
|
|
" ",
|
|
xyz2.Z.ToString(),
|
|
"\n"
|
|
}));
|
|
}
|
|
foreach (UV uv in node.GetUVs())
|
|
{
|
|
this.swObj.Write(string.Concat(new string[]
|
|
{
|
|
"vt ",
|
|
(uv.U * 0.3048).ToString(),
|
|
" ",
|
|
(uv.V * 0.3048).ToString(),
|
|
" 0.0\n"
|
|
}));
|
|
}
|
|
foreach (PolymeshFacet polymeshFacet in node.GetFacets())
|
|
{
|
|
this.swObj.Write(string.Concat(new string[]
|
|
{
|
|
"f ",
|
|
(polymeshFacet.V1 + 1 + this.vIndex).ToString(),
|
|
"/",
|
|
(polymeshFacet.V1 + 1 + this.vIndex).ToString(),
|
|
" ",
|
|
(polymeshFacet.V2 + 1 + this.vIndex).ToString(),
|
|
"/",
|
|
(polymeshFacet.V2 + 1 + this.vIndex).ToString(),
|
|
" ",
|
|
(polymeshFacet.V3 + 1 + this.vIndex).ToString(),
|
|
"/",
|
|
(polymeshFacet.V3 + 1 + this.vIndex).ToString(),
|
|
"\n"
|
|
}));
|
|
}
|
|
this.vIndex += node.NumberOfPoints;
|
|
}
|
|
|
|
// Token: 0x06000038 RID: 56 RVA: 0x000045D0 File Offset: 0x000027D0
|
|
public void OnFaceEnd(FaceNode node)
|
|
{
|
|
}
|
|
|
|
// Token: 0x06000039 RID: 57 RVA: 0x000045D2 File Offset: 0x000027D2
|
|
public void OnInstanceEnd(InstanceNode node)
|
|
{
|
|
this.m_TransformationStack.Pop();
|
|
}
|
|
|
|
// Token: 0x0600003A RID: 58 RVA: 0x000045E0 File Offset: 0x000027E0
|
|
public void OnElementEnd(ElementId elementId)
|
|
{
|
|
}
|
|
|
|
// Token: 0x0600003B RID: 59 RVA: 0x000045E2 File Offset: 0x000027E2
|
|
public void OnLinkEnd(LinkNode node)
|
|
{
|
|
}
|
|
|
|
// Token: 0x0600003C RID: 60 RVA: 0x000045E4 File Offset: 0x000027E4
|
|
public void OnViewEnd(ElementId elementId)
|
|
{
|
|
Utils_SendMessage.UpdateProgressUI(95, 95, 1.0);
|
|
File.WriteAllLines("D:\\huarun_0105.txt", (from x in this.productTris
|
|
orderby x.Value
|
|
select string.Format("{0} {1}", x.Key, x.Value)).ToArray<string>());
|
|
}
|
|
|
|
// Token: 0x0600003D RID: 61 RVA: 0x00004660 File Offset: 0x00002860
|
|
public bool IsCanceled()
|
|
{
|
|
return false;
|
|
}
|
|
|
|
// Token: 0x0600003E RID: 62 RVA: 0x00004663 File Offset: 0x00002863
|
|
public void Finish()
|
|
{
|
|
this.swObj.Close();
|
|
this.swMtl.Close();
|
|
}
|
|
|
|
// Token: 0x0600003F RID: 63 RVA: 0x0000467C File Offset: 0x0000287C
|
|
private bool IsTextureAsset(Asset asset)
|
|
{
|
|
AssetProperty assetProperty = this.GetAssetProperty(asset, "assettype");
|
|
return (assetProperty != null && (assetProperty as AssetPropertyString).Value == "texture") || this.GetAssetProperty(asset, "unifiedbitmap_Bitmap") != null;
|
|
}
|
|
|
|
// Token: 0x06000040 RID: 64 RVA: 0x000046C4 File Offset: 0x000028C4
|
|
private AssetProperty GetAssetProperty(Asset asset, string propertyName)
|
|
{
|
|
for (int i = 0; i < asset.Size; i++)
|
|
{
|
|
if (asset[i].Name == propertyName)
|
|
{
|
|
return asset[i];
|
|
}
|
|
}
|
|
return null;
|
|
}
|
|
|
|
// Token: 0x06000041 RID: 65 RVA: 0x00004700 File Offset: 0x00002900
|
|
private Asset FindTextureAsset(AssetProperty ap)
|
|
{
|
|
Asset asset = null;
|
|
if (ap.Type == (AssetPropertyType)15)
|
|
{
|
|
if (!this.IsTextureAsset(ap as Asset))
|
|
{
|
|
for (int i = 0; i < (ap as Asset).Size; i++)
|
|
{
|
|
if (this.FindTextureAsset((ap as Asset)[i]) != null)
|
|
{
|
|
return this.FindTextureAsset((ap as Asset)[i]);
|
|
}
|
|
}
|
|
}
|
|
else
|
|
{
|
|
asset = ap as Asset;
|
|
}
|
|
return asset;
|
|
}
|
|
for (int j = 0; j < ap.NumberOfConnectedProperties; j++)
|
|
{
|
|
if (this.FindTextureAsset(ap.GetConnectedProperty(j)) != null)
|
|
{
|
|
return this.FindTextureAsset(ap.GetConnectedProperty(j));
|
|
}
|
|
}
|
|
return asset;
|
|
}
|
|
|
|
// Token: 0x06000042 RID: 66 RVA: 0x000047A4 File Offset: 0x000029A4
|
|
private string ParseAssetProperty(AssetProperty prop)
|
|
{
|
|
if (prop == null)
|
|
{
|
|
return null;
|
|
}
|
|
if (prop.Name == "unifiedbitmap_Bitmap")
|
|
{
|
|
string value = (prop as AssetPropertyString).Value;
|
|
if (value.Length > 0)
|
|
{
|
|
return value.Split(new char[] { '|' })[0];
|
|
}
|
|
}
|
|
foreach (AssetProperty assetProperty in prop.GetAllConnectedProperties())
|
|
{
|
|
string text = this.ParseAssetProperty(assetProperty);
|
|
if (text != null)
|
|
{
|
|
return text;
|
|
}
|
|
}
|
|
AssetPropertyType type = prop.Type;
|
|
if (type !=(AssetPropertyType) 1)
|
|
{
|
|
if (type != (AssetPropertyType)15)
|
|
{
|
|
if (type == (AssetPropertyType)19)
|
|
{
|
|
foreach (AssetProperty assetProperty2 in (prop as AssetPropertyList).GetValue())
|
|
{
|
|
string text2 = this.ParseAssetProperty(assetProperty2);
|
|
if (text2 != null)
|
|
{
|
|
return text2;
|
|
}
|
|
}
|
|
}
|
|
}
|
|
else
|
|
{
|
|
Asset asset = prop as Asset;
|
|
for (int i = 0; i < asset.Size; i++)
|
|
{
|
|
AssetProperty assetProperty3 = asset[i];
|
|
string text3 = this.ParseAssetProperty(assetProperty3);
|
|
if (text3 != null)
|
|
{
|
|
return text3;
|
|
}
|
|
}
|
|
}
|
|
}
|
|
else
|
|
{
|
|
AssetProperties assetProperties = prop as AssetProperties;
|
|
for (int j = 0; j < assetProperties.Size; j++)
|
|
{
|
|
AssetProperty assetProperty4 = assetProperties[j];
|
|
string text4 = this.ParseAssetProperty(assetProperty4);
|
|
if (text4 != null)
|
|
{
|
|
return text4;
|
|
}
|
|
}
|
|
}
|
|
return null;
|
|
}
|
|
|
|
// Token: 0x04000020 RID: 32
|
|
private StreamWriter swObj;
|
|
|
|
// Token: 0x04000021 RID: 33
|
|
private StreamWriter swMtl;
|
|
|
|
// Token: 0x04000022 RID: 34
|
|
private const string strNewmtl = "\nnewmtl {0}\nka {1} {2} {3}\nkd {1} {2} {3}\nd {4}\n";
|
|
|
|
// Token: 0x04000023 RID: 35
|
|
private ElementId currentMaterialId;
|
|
|
|
// Token: 0x04000024 RID: 36
|
|
private Color currentColor;
|
|
|
|
// Token: 0x04000025 RID: 37
|
|
private bool useElementTypeTexture;
|
|
|
|
// Token: 0x04000026 RID: 38
|
|
private HashSet<string> texturePathes = new HashSet<string>();
|
|
|
|
// Token: 0x04000027 RID: 39
|
|
private HashSet<ElementId> materialIds = new HashSet<ElementId>();
|
|
|
|
// Token: 0x04000028 RID: 40
|
|
private double currentTransparency;
|
|
|
|
// Token: 0x04000029 RID: 41
|
|
private Asset currentAsset;
|
|
|
|
// Token: 0x0400002A RID: 42
|
|
private int _precision;
|
|
|
|
// Token: 0x0400002B RID: 43
|
|
private Document m_doc;
|
|
|
|
// Token: 0x0400002C RID: 44
|
|
private Stack<Transform> m_TransformationStack = new Stack<Transform>();
|
|
|
|
// Token: 0x0400002D RID: 45
|
|
private ElementId currentId;
|
|
|
|
// Token: 0x0400002E RID: 46
|
|
private int vIndex;
|
|
|
|
// Token: 0x0400002F RID: 47
|
|
private string textureLibraryPath = "";
|
|
|
|
// Token: 0x04000030 RID: 48
|
|
private string textureName = "";
|
|
|
|
// Token: 0x04000031 RID: 49
|
|
private string resultPath;
|
|
|
|
// Token: 0x04000032 RID: 50
|
|
private string resultTexturePath;
|
|
|
|
// Token: 0x04000033 RID: 51
|
|
private static double feetToMM = 304.8;
|
|
|
|
// Token: 0x04000034 RID: 52
|
|
private int elementPolyIndex;
|
|
|
|
// Token: 0x04000035 RID: 53
|
|
public int totalElementCount;
|
|
|
|
// Token: 0x04000036 RID: 54
|
|
private int currentElementCount;
|
|
|
|
// Token: 0x04000037 RID: 55
|
|
private Log log;
|
|
|
|
// Token: 0x04000038 RID: 56
|
|
private Dictionary<int, int> productTris = new Dictionary<int, int>();
|
|
}
|
|
}
|