样式demo
This commit is contained in:
@@ -84,7 +84,7 @@ public static class DWGAssist
|
||||
}
|
||||
|
||||
//保存文件
|
||||
ACadSharp.IO.DxfWriter.Write(output, doc, false, OnNotification);
|
||||
ACadSharp.IO.DxfWriter.Write(output, doc);
|
||||
}
|
||||
|
||||
|
||||
@@ -115,7 +115,7 @@ public static class DWGAssist
|
||||
/// <param name="doc"></param>
|
||||
public static void WriteAsciiDxf(this CadDocument doc, string filePath)
|
||||
{
|
||||
ACadSharp.IO.DxfWriter.Write(filePath, doc, false, OnNotification);
|
||||
ACadSharp.IO.DxfWriter.Write(filePath, doc);
|
||||
}
|
||||
|
||||
/// <summary>
|
||||
@@ -125,7 +125,7 @@ public static class DWGAssist
|
||||
/// <param name="doc"></param>
|
||||
public static void WriteBinaryDxf(this CadDocument doc, string filePath)
|
||||
{
|
||||
ACadSharp.IO.DxfWriter.Write(filePath, doc, true, OnNotification);
|
||||
ACadSharp.IO.DxfWriter.Write(filePath, doc);
|
||||
}
|
||||
|
||||
/// <summary>
|
||||
|
||||
@@ -31,12 +31,10 @@ namespace ShrlAlgoToolkit.RevitAddins.Assists
|
||||
private static byte[] BitSourceToArray(BitmapSource bitmapSource)
|
||||
{
|
||||
BitmapEncoder encoder = new JpegBitmapEncoder();
|
||||
using (var ms = new MemoryStream())
|
||||
{
|
||||
encoder.Frames.Add(BitmapFrame.Create(bitmapSource));
|
||||
encoder.Save(ms);
|
||||
return ms.ToArray();
|
||||
}
|
||||
using var ms = new MemoryStream();
|
||||
encoder.Frames.Add(BitmapFrame.Create(bitmapSource));
|
||||
encoder.Save(ms);
|
||||
return ms.ToArray();
|
||||
}
|
||||
|
||||
private static int GetPngStartingOffset(byte[] previewData)
|
||||
@@ -44,87 +42,85 @@ namespace ShrlAlgoToolkit.RevitAddins.Assists
|
||||
var markerFound = false;
|
||||
var startingOffset = 0;
|
||||
var previousValue = 0;
|
||||
using (var ms = new MemoryStream(previewData))
|
||||
using var ms = new MemoryStream(previewData);
|
||||
for (var i = 0; i < previewData.Length; i++)
|
||||
{
|
||||
for (var i = 0; i < previewData.Length; i++)
|
||||
var currentValue = ms.ReadByte();
|
||||
// possible start of PNG file data
|
||||
if (currentValue == 137) // 0x89
|
||||
{
|
||||
var currentValue = ms.ReadByte();
|
||||
// possible start of PNG file data
|
||||
if (currentValue == 137) // 0x89
|
||||
{
|
||||
markerFound = true;
|
||||
startingOffset = i;
|
||||
previousValue = currentValue;
|
||||
continue;
|
||||
}
|
||||
markerFound = true;
|
||||
startingOffset = i;
|
||||
previousValue = currentValue;
|
||||
continue;
|
||||
}
|
||||
|
||||
switch (currentValue)
|
||||
{
|
||||
case 80: // 0x50
|
||||
if (markerFound && previousValue == 137)
|
||||
{
|
||||
previousValue = currentValue;
|
||||
continue;
|
||||
}
|
||||
switch (currentValue)
|
||||
{
|
||||
case 80: // 0x50
|
||||
if (markerFound && previousValue == 137)
|
||||
{
|
||||
previousValue = currentValue;
|
||||
continue;
|
||||
}
|
||||
|
||||
markerFound = false;
|
||||
break;
|
||||
markerFound = false;
|
||||
break;
|
||||
|
||||
case 78: // 0x4E
|
||||
if (markerFound && previousValue == 80)
|
||||
{
|
||||
previousValue = currentValue;
|
||||
continue;
|
||||
}
|
||||
case 78: // 0x4E
|
||||
if (markerFound && previousValue == 80)
|
||||
{
|
||||
previousValue = currentValue;
|
||||
continue;
|
||||
}
|
||||
|
||||
markerFound = false;
|
||||
break;
|
||||
markerFound = false;
|
||||
break;
|
||||
|
||||
case 71: // 0x47
|
||||
if (markerFound && previousValue == 78)
|
||||
{
|
||||
previousValue = currentValue;
|
||||
continue;
|
||||
}
|
||||
case 71: // 0x47
|
||||
if (markerFound && previousValue == 78)
|
||||
{
|
||||
previousValue = currentValue;
|
||||
continue;
|
||||
}
|
||||
|
||||
markerFound = false;
|
||||
break;
|
||||
markerFound = false;
|
||||
break;
|
||||
|
||||
case 13: // 0x0D
|
||||
if (markerFound && previousValue == 71)
|
||||
{
|
||||
previousValue = currentValue;
|
||||
continue;
|
||||
}
|
||||
case 13: // 0x0D
|
||||
if (markerFound && previousValue == 71)
|
||||
{
|
||||
previousValue = currentValue;
|
||||
continue;
|
||||
}
|
||||
|
||||
markerFound = false;
|
||||
break;
|
||||
markerFound = false;
|
||||
break;
|
||||
|
||||
case 10: // 0x0A
|
||||
if (markerFound && previousValue == 26)
|
||||
{
|
||||
return startingOffset;
|
||||
}
|
||||
case 10: // 0x0A
|
||||
if (markerFound && previousValue == 26)
|
||||
{
|
||||
return startingOffset;
|
||||
}
|
||||
|
||||
if (markerFound && previousValue == 13)
|
||||
{
|
||||
previousValue = currentValue;
|
||||
continue;
|
||||
}
|
||||
if (markerFound && previousValue == 13)
|
||||
{
|
||||
previousValue = currentValue;
|
||||
continue;
|
||||
}
|
||||
|
||||
markerFound = false;
|
||||
break;
|
||||
markerFound = false;
|
||||
break;
|
||||
|
||||
case 26: // 0x1A
|
||||
if (markerFound && previousValue == 10)
|
||||
{
|
||||
previousValue = currentValue;
|
||||
continue;
|
||||
}
|
||||
case 26: // 0x1A
|
||||
if (markerFound && previousValue == 10)
|
||||
{
|
||||
previousValue = currentValue;
|
||||
continue;
|
||||
}
|
||||
|
||||
markerFound = false;
|
||||
break;
|
||||
}
|
||||
markerFound = false;
|
||||
break;
|
||||
}
|
||||
}
|
||||
|
||||
@@ -139,22 +135,18 @@ namespace ShrlAlgoToolkit.RevitAddins.Assists
|
||||
/// <returns></returns>
|
||||
private static Image GetPreviewAsImage(byte[] previewData)
|
||||
{
|
||||
if (previewData == null || previewData.Length <= 0)
|
||||
if (previewData is not { Length: > 0 })
|
||||
{
|
||||
using (var newBitmap = new Bitmap(128, 128))
|
||||
{
|
||||
return newBitmap.Clone() as Bitmap;
|
||||
}
|
||||
using var newBitmap = new Bitmap(128, 128);
|
||||
return newBitmap.Clone() as Bitmap;
|
||||
}
|
||||
|
||||
// read past the Revit metadata to the start of the PNG image
|
||||
var startingOffset = GetPngStartingOffset(previewData);
|
||||
if (startingOffset == 0)
|
||||
{
|
||||
using (var newBitmap = new Bitmap(128, 128))
|
||||
{
|
||||
return newBitmap.Clone() as Bitmap;
|
||||
}
|
||||
using var newBitmap = new Bitmap(128, 128);
|
||||
return newBitmap.Clone() as Bitmap;
|
||||
}
|
||||
|
||||
try
|
||||
@@ -174,29 +166,20 @@ namespace ShrlAlgoToolkit.RevitAddins.Assists
|
||||
{
|
||||
// use a memory stream to decode the PNG image data
|
||||
// and copy the decoded data into a byte array
|
||||
using (var ms = new MemoryStream(pngDataBuffer))
|
||||
{
|
||||
var decoder = new PngBitmapDecoder(ms, BitmapCreateOptions.PreservePixelFormat,
|
||||
BitmapCacheOption.Default);
|
||||
decoderData = BitSourceToArray(decoder.Frames[0]);
|
||||
}
|
||||
using var ms = new MemoryStream(pngDataBuffer);
|
||||
var decoder = new PngBitmapDecoder(ms, BitmapCreateOptions.PreservePixelFormat,
|
||||
BitmapCacheOption.Default);
|
||||
decoderData = BitSourceToArray(decoder.Frames[0]);
|
||||
}
|
||||
|
||||
// if the decoded data is valie
|
||||
if (decoderData != null && decoderData.Length > 0)
|
||||
if (decoderData is { Length: > 0 })
|
||||
{
|
||||
// use another memory stream to create a Bitmap
|
||||
// and then an Image from that Bitmap
|
||||
using (var ms = new MemoryStream(decoderData))
|
||||
{
|
||||
using (var newBitmap = new Bitmap(ms))
|
||||
{
|
||||
using (Image newImage = newBitmap)
|
||||
{
|
||||
return newImage.Clone() as Image;
|
||||
}
|
||||
}
|
||||
}
|
||||
using var ms = new MemoryStream(decoderData);
|
||||
using var newBitmap = new Bitmap(ms);
|
||||
using Image newImage = newBitmap;
|
||||
return newImage.Clone() as Image;
|
||||
}
|
||||
}
|
||||
catch (Exception ex)
|
||||
@@ -237,9 +220,9 @@ namespace ShrlAlgoToolkit.RevitAddins.Assists
|
||||
try
|
||||
{
|
||||
detailInfo = detailInfo.Trim();
|
||||
var index = detailInfo.IndexOf(":");
|
||||
var detailValue = detailInfo.Substring(detailInfo.IndexOf(":") + 1);
|
||||
var detailKey = detailInfo.Substring(0, detailInfo.IndexOf(":"));
|
||||
var index = detailInfo.IndexOf(":", StringComparison.Ordinal);
|
||||
var detailValue = detailInfo.Substring(index + 1);
|
||||
var detailKey = detailInfo.Substring(0, index);
|
||||
detailKey = detailKey.Trim().ToUpper().Replace(" ", string.Empty);
|
||||
detailKey = PurgeUnprintableCharacters(detailKey);
|
||||
detailValue = PurgeUnprintableCharacters(detailValue);
|
||||
@@ -339,93 +322,91 @@ namespace ShrlAlgoToolkit.RevitAddins.Assists
|
||||
|
||||
string xmlStr;
|
||||
byte[] streamData;
|
||||
using (var streamReader = streamInfo.GetStream(FileMode.Open, FileAccess.Read))
|
||||
using var streamReader = streamInfo.GetStream(FileMode.Open, FileAccess.Read);
|
||||
streamData = new byte[streamReader.Length];
|
||||
streamReader.Read(streamData, 0, streamData.Length);
|
||||
xmlStr = Encoding.UTF8.GetString(streamData);
|
||||
document.LoadXml(xmlStr);
|
||||
//string xmldocpath = Path.GetFileNameWithoutExtension(FileName) + ".xml";
|
||||
//document.Save(xmldocpath);
|
||||
|
||||
//读取参数信息
|
||||
var root = document.DocumentElement;
|
||||
//节点前缀的命名空间
|
||||
var nameSpace = root.GetNamespaceOfPrefix("A");
|
||||
//string nameSpace = root.NamespaceURI;
|
||||
var nsmgr = new XmlNamespaceManager(document.NameTable);
|
||||
;
|
||||
nsmgr.AddNamespace("entry", nameSpace);
|
||||
|
||||
//族类型
|
||||
var xnlist = document.GetElementsByTagName("A:part");
|
||||
|
||||
var fileinfo = document.GetElementsByTagName("A:design-file");
|
||||
foreach (XmlNode xn in fileinfo)
|
||||
{
|
||||
streamData = new byte[streamReader.Length];
|
||||
streamReader.Read(streamData, 0, streamData.Length);
|
||||
xmlStr = Encoding.UTF8.GetString(streamData);
|
||||
document.LoadXml(xmlStr);
|
||||
//string xmldocpath = Path.GetFileNameWithoutExtension(FileName) + ".xml";
|
||||
//document.Save(xmldocpath);
|
||||
|
||||
//读取参数信息
|
||||
var root = document.DocumentElement;
|
||||
//节点前缀的命名空间
|
||||
var nameSpace = root.GetNamespaceOfPrefix("A");
|
||||
//string nameSpace = root.NamespaceURI;
|
||||
var nsmgr = new XmlNamespaceManager(document.NameTable);
|
||||
;
|
||||
nsmgr.AddNamespace("entry", nameSpace);
|
||||
|
||||
//族类型
|
||||
var xnlist = document.GetElementsByTagName("A:part");
|
||||
|
||||
var fileinfo = document.GetElementsByTagName("A:design-file");
|
||||
foreach (XmlNode xn in fileinfo)
|
||||
if (xn.HasChildNodes)
|
||||
{
|
||||
if (xn.HasChildNodes)
|
||||
foreach (XmlNode child in xn.ChildNodes)
|
||||
{
|
||||
foreach (XmlNode child in xn.ChildNodes)
|
||||
if (child.Name == "A:title")
|
||||
{
|
||||
if (child.Name == "A:title")
|
||||
{
|
||||
SafeName = child.InnerText;
|
||||
}
|
||||
SafeName = child.InnerText;
|
||||
}
|
||||
|
||||
if (child.Name == "A:product")
|
||||
{
|
||||
Product = child.InnerText;
|
||||
}
|
||||
if (child.Name == "A:product")
|
||||
{
|
||||
Product = child.InnerText;
|
||||
}
|
||||
|
||||
if (child.Name == "A:product-version")
|
||||
{
|
||||
RevitVersion = child.InnerText;
|
||||
}
|
||||
if (child.Name == "A:product-version")
|
||||
{
|
||||
RevitVersion = child.InnerText;
|
||||
}
|
||||
|
||||
if (child.Name == "A:product-updated")
|
||||
{
|
||||
UpdateTime = child.InnerText;
|
||||
}
|
||||
if (child.Name == "A:product-updated")
|
||||
{
|
||||
UpdateTime = child.InnerText;
|
||||
}
|
||||
}
|
||||
}
|
||||
//XmlNode rootnode = document.SelectSingleNode("/entry/A: family/A:part", nsmgr);
|
||||
//XmlNodeList xnlist = rootnode.ChildNodes;
|
||||
|
||||
var symbols = new List<FamilyTypeDefinition>();
|
||||
foreach (XmlNode xn in xnlist)
|
||||
{
|
||||
//XmlAttributeCollection attriCol = xn.Attributes;
|
||||
//foreach (XmlAttribute xmlAttri in attriCol)
|
||||
//{
|
||||
// string name = xmlAttri.Name;
|
||||
// string value = xmlAttri.Value;
|
||||
//}
|
||||
var symbol = new FamilyTypeDefinition();
|
||||
if (xn.HasChildNodes)
|
||||
{
|
||||
foreach (XmlNode child in xn.ChildNodes)
|
||||
{
|
||||
var p = new ParameterDefinition();
|
||||
if (child.Name == "title")
|
||||
{
|
||||
symbol.Name = child.InnerText;
|
||||
continue;
|
||||
}
|
||||
|
||||
//族类型节点
|
||||
p.Name = child.Name;
|
||||
//族名称
|
||||
p.Value = child.InnerText;
|
||||
symbol.ParameterDefinitions.Add(p);
|
||||
}
|
||||
}
|
||||
|
||||
symbols.Add(symbol);
|
||||
}
|
||||
|
||||
return symbols;
|
||||
}
|
||||
//XmlNode rootnode = document.SelectSingleNode("/entry/A: family/A:part", nsmgr);
|
||||
//XmlNodeList xnlist = rootnode.ChildNodes;
|
||||
|
||||
var symbols = new List<FamilyTypeDefinition>();
|
||||
foreach (XmlNode xn in xnlist)
|
||||
{
|
||||
//XmlAttributeCollection attriCol = xn.Attributes;
|
||||
//foreach (XmlAttribute xmlAttri in attriCol)
|
||||
//{
|
||||
// string name = xmlAttri.Name;
|
||||
// string value = xmlAttri.Value;
|
||||
//}
|
||||
var symbol = new FamilyTypeDefinition();
|
||||
if (xn.HasChildNodes)
|
||||
{
|
||||
foreach (XmlNode child in xn.ChildNodes)
|
||||
{
|
||||
var p = new ParameterDefinition();
|
||||
if (child.Name == "title")
|
||||
{
|
||||
symbol.Name = child.InnerText;
|
||||
continue;
|
||||
}
|
||||
|
||||
//族类型节点
|
||||
p.Name = child.Name;
|
||||
//族名称
|
||||
p.Value = child.InnerText;
|
||||
symbol.ParameterDefinitions.Add(p);
|
||||
}
|
||||
}
|
||||
|
||||
symbols.Add(symbol);
|
||||
}
|
||||
|
||||
return symbols;
|
||||
}
|
||||
|
||||
private static StringBuilder ParsePartAtom(string unicodeData)
|
||||
@@ -448,19 +429,42 @@ namespace ShrlAlgoToolkit.RevitAddins.Assists
|
||||
return s;
|
||||
}
|
||||
/// <summary>
|
||||
/// 解析预览图像
|
||||
/// 解析预览图像(使用循环确保完整读取,避免 CA2022 警告)
|
||||
/// </summary>
|
||||
/// <param name="stream"></param>
|
||||
/// <returns></returns>
|
||||
private static Image ParsePreviewImage(StreamInfo stream)
|
||||
{
|
||||
byte[] streamData = null;
|
||||
byte[] streamData;
|
||||
using (var streamReader = stream.GetStream(FileMode.Open, FileAccess.Read))
|
||||
{
|
||||
streamData = new byte[streamReader.Length];
|
||||
streamReader.Read(streamData, 0, streamData.Length);
|
||||
//unicodeData = Encoding.Unicode.GetString(streamData);
|
||||
//unicodeData = Encoding.UTF8.GetString(streamData);
|
||||
// 获取长度并校验
|
||||
long lengthLong = streamReader.Length;
|
||||
if (lengthLong < 0)
|
||||
{
|
||||
throw new IOException("Stream length is negative.");
|
||||
}
|
||||
|
||||
if (lengthLong > int.MaxValue)
|
||||
{
|
||||
throw new IOException("Stream is too large to be read into a single byte array.");
|
||||
}
|
||||
|
||||
var totalBytes = (int)lengthLong;
|
||||
streamData = new byte[totalBytes];
|
||||
|
||||
int offset = 0;
|
||||
while (offset < totalBytes)
|
||||
{
|
||||
int bytesRead = streamReader.Read(streamData, offset, totalBytes - offset);
|
||||
if (bytesRead == 0)
|
||||
{
|
||||
// 流在预期字节读取完成前就结束,抛出异常以避免不完整数据处理
|
||||
throw new EndOfStreamException("Unable to read the full stream data.");
|
||||
}
|
||||
|
||||
offset += bytesRead;
|
||||
}
|
||||
}
|
||||
|
||||
return GetPreviewAsImage(streamData);
|
||||
@@ -537,10 +541,9 @@ namespace ShrlAlgoToolkit.RevitAddins.Assists
|
||||
foreach (var streamInfo in streams)
|
||||
{
|
||||
string unicodeData;
|
||||
byte[] streamData = null;
|
||||
using (var streamReader = streamInfo.GetStream(FileMode.Open, FileAccess.Read))
|
||||
{
|
||||
streamData = new byte[streamReader.Length];
|
||||
byte[] streamData = new byte[streamReader.Length];
|
||||
streamReader.Read(streamData, 0, streamData.Length);
|
||||
unicodeData = Encoding.Unicode.GetString(streamData);
|
||||
//unicodeData = Encoding.UTF8.GetString(streamData);
|
||||
@@ -601,7 +604,7 @@ namespace ShrlAlgoToolkit.RevitAddins.Assists
|
||||
foreach (var letter in oldValueArray)
|
||||
{
|
||||
int decimalValue = letter;
|
||||
if (decimalValue >= 32 && decimalValue <= 126)
|
||||
if (decimalValue is >= 32 and <= 126)
|
||||
{
|
||||
sb.Append(letter);
|
||||
}
|
||||
|
||||
38
ShrlAlgoToolkit.RevitAddins/Confuser.crproj
Normal file
38
ShrlAlgoToolkit.RevitAddins/Confuser.crproj
Normal file
@@ -0,0 +1,38 @@
|
||||
<project outputDir="Confused" baseDir="." xmlns="http://confuser.codeplex.com">
|
||||
<!--
|
||||
1. 全局规则:开启常规混淆
|
||||
preset="normal" 包含了:控制流混淆、参数重命名、资源加密等。
|
||||
它也会默认开启重命名(rename)。
|
||||
-->
|
||||
<rule pattern="true" preset="normal">
|
||||
<!-- 可以在这里微调全局设置,比如加强控制流 -->
|
||||
<protection id="ctrl flow" />
|
||||
</rule>
|
||||
|
||||
<!--
|
||||
2. 关键规则:保留所有类名(不重命名类)
|
||||
pattern="member-type('type')" 意思是指:匹配所有的“类型”定义(Class/Interface/Struct)。
|
||||
action="remove" 意思是指:对匹配到的这些项,移除指定的保护。
|
||||
-->
|
||||
<rule pattern="member-type('type')">
|
||||
<protection id="rename" action="remove" />
|
||||
</rule>
|
||||
|
||||
<!-- 3. (可选但推荐) 确保 RevitAPI 接口方法不被错误重命名 -->
|
||||
<!--
|
||||
通常 ConfuserEx 会自动识别接口实现不进行重命名,但为了保险,
|
||||
可以显式排除 Execute 和 OnStartup 方法。
|
||||
-->
|
||||
<rule pattern="name('Execute') or name('OnStartup') or name('OnShutdown')">
|
||||
<protection id="rename" action="remove" />
|
||||
</rule>
|
||||
|
||||
<!-- 4. 指定模块 -->
|
||||
<module path="ShrlAlgoToolkit.RevitAddins.dll" />
|
||||
|
||||
<!-- 5. 引用路径 (非常重要) -->
|
||||
<!-- 为了让ConfuserEx知道哪些方法是接口实现(从而不重命名它们),它需要找到 RevitAPI.dll -->
|
||||
<!-- 请根据您的Revit安装路径修改,或者确保RevitAPI.dll在编译输出目录中 -->
|
||||
<!-- <probePath>C:\Program Files\Autodesk\Revit 2020</probePath>-->
|
||||
|
||||
</project>
|
||||
@@ -464,7 +464,7 @@ namespace ShrlAlgoToolkit.RevitAddins.RvCommon
|
||||
//{
|
||||
// foreach (var curve in item)
|
||||
// {
|
||||
// previewIds.Add(DebugAssist.CreateTransientElements(doc, curve));
|
||||
// previewIds.Add(DebugExtensions.CreateTransientElements(doc, curve));
|
||||
// }
|
||||
//}
|
||||
//var solid = GeometryCreationUtilities.CreateSweptGeometry(
|
||||
|
||||
@@ -7,7 +7,7 @@ using CommunityToolkit.Mvvm.Input;
|
||||
|
||||
using Nice3point.Revit.Toolkit.External.Handlers;
|
||||
|
||||
using RandomColorGenerator;
|
||||
//using RandomColorGenerator;
|
||||
|
||||
|
||||
namespace ShrlAlgoToolkit.RevitAddins.RvMEP;
|
||||
@@ -37,33 +37,24 @@ public partial class HeadroomCheckViewModel : ObservableObject
|
||||
var allRooms = uiapp.ActiveUIDocument.Document.OfClass<SpatialElement>().OfType<Room>();
|
||||
var groups = allRooms.GroupBy(r => r.Name);
|
||||
IEnumerable<IGrouping<string, Room>> enumerable = groups as IGrouping<string, Room>[] ?? groups.ToArray();
|
||||
var colors = GetRandomColors(enumerable.Count());
|
||||
for (int i = 0; i < enumerable.Count(); i++)
|
||||
{
|
||||
var group = enumerable.ElementAt(i);
|
||||
var color = colors.ElementAt(i);
|
||||
foreach (var room in group)
|
||||
{
|
||||
var r = new RoomCheckItem()
|
||||
{
|
||||
Room = room,
|
||||
Name = room.Name,
|
||||
Color = color,
|
||||
};
|
||||
roomItems.Add(r);
|
||||
}
|
||||
}
|
||||
return roomItems;
|
||||
}
|
||||
private static IEnumerable<Color> GetRandomColors(int count)
|
||||
{
|
||||
var colors = RandomColor.GetColors(ColorScheme.Random, Luminosity.Light, count);
|
||||
|
||||
return colors.Select(color => new Color(color.R, color.G, color.B));
|
||||
}
|
||||
private bool CanClick()
|
||||
{
|
||||
return Enumerable.Any<RoomCheckItem>(Rooms);
|
||||
return Rooms is { Count: > 0 };
|
||||
}
|
||||
[RelayCommand(CanExecute = nameof(CanClick))]
|
||||
private void AnalysisHeadroom()
|
||||
|
||||
@@ -1,6 +1,7 @@
|
||||
using Autodesk.Revit.DB;
|
||||
using Autodesk.Revit.DB.Architecture;
|
||||
using CommunityToolkit.Mvvm.ComponentModel;
|
||||
using ShrlAlgoToolkit.Core.Assists;
|
||||
|
||||
namespace ShrlAlgoToolkit.RevitAddins.RvMEP
|
||||
{
|
||||
@@ -13,9 +14,10 @@ namespace ShrlAlgoToolkit.RevitAddins.RvMEP
|
||||
public partial string Name { get; set; }
|
||||
|
||||
[ObservableProperty]
|
||||
[NotifyPropertyChangedFor(nameof(Color))]
|
||||
public partial Room Room { get; set; }
|
||||
|
||||
[ObservableProperty]
|
||||
public partial Color Color { get; set; }
|
||||
public partial Color Color { get; set; } = ColorAssist.GetDistinctColorById(Room.Id);
|
||||
}
|
||||
}
|
||||
|
||||
@@ -0,0 +1,38 @@
|
||||
<project outputDir="." baseDir="." xmlns="http://confuser.codeplex.com">
|
||||
<!--
|
||||
1. 全局规则:开启常规混淆
|
||||
preset="normal" 包含了:控制流混淆、参数重命名、资源加密等。
|
||||
它也会默认开启重命名(rename)。
|
||||
-->
|
||||
<rule pattern="true" preset="normal">
|
||||
<!-- 可以在这里微调全局设置,比如加强控制流 -->
|
||||
<protection id="ctrl flow" />
|
||||
</rule>
|
||||
|
||||
<!--
|
||||
2. 关键规则:保留所有类名(不重命名类)
|
||||
pattern="member-type('type')" 意思是指:匹配所有的“类型”定义(Class/Interface/Struct)。
|
||||
action="remove" 意思是指:对匹配到的这些项,移除指定的保护。
|
||||
-->
|
||||
<rule pattern="member-type('type')">
|
||||
<protection id="rename" action="remove" />
|
||||
</rule>
|
||||
|
||||
<!-- 3. (可选但推荐) 确保 RevitAPI 接口方法不被错误重命名 -->
|
||||
<!--
|
||||
通常 ConfuserEx 会自动识别接口实现不进行重命名,但为了保险,
|
||||
可以显式排除 Execute 和 OnStartup 方法。
|
||||
-->
|
||||
<rule pattern="name('Execute') or name('OnStartup') or name('OnShutdown')">
|
||||
<protection id="rename" action="remove" />
|
||||
</rule>
|
||||
|
||||
<!-- 4. 指定模块 -->
|
||||
<module path="ShrlAlgoToolkit.RevitAddins.dll" />
|
||||
|
||||
<!-- 5. 引用路径 (非常重要) -->
|
||||
<!-- 为了让ConfuserEx知道哪些方法是接口实现(从而不重命名它们),它需要找到 RevitAPI.dll -->
|
||||
<!-- 请根据您的Revit安装路径修改,或者确保RevitAPI.dll在编译输出目录中 -->
|
||||
<!-- <probePath>C:\Program Files\Autodesk\Revit 2020</probePath>-->
|
||||
|
||||
</project>
|
||||
@@ -72,6 +72,16 @@
|
||||
<DebugType>None</DebugType>
|
||||
<OutputPath>..\bin\Release\$(RevitVersion)</OutputPath>
|
||||
</PropertyGroup>
|
||||
<PropertyGroup>
|
||||
<Obfuscate>true</Obfuscate>
|
||||
<!--Default values. The following lines can be removed, unless they are changed.-->
|
||||
<ConfuserReplaceOutput>true</ConfuserReplaceOutput>
|
||||
<ConfuserProject>$(MSBuildProjectDirectory)\$(MSBuildProjectName).crproj</ConfuserProject>
|
||||
<ConfuserKeyFile>$(AssemblyOriginatorKeyFile)</ConfuserKeyFile>
|
||||
<ConfuserIntermediateOutputPath>$(IntermediateOutputPath)</ConfuserIntermediateOutputPath>
|
||||
<ConfuserOutDir>$(OutDir)</ConfuserOutDir>
|
||||
<ConfuserSymbolFileName>symbols.map</ConfuserSymbolFileName>
|
||||
</PropertyGroup>
|
||||
<ItemGroup>
|
||||
<!-- <Reference Include="Microsoft.CSharp" Condition="'$(RevitVersion)' == '2018' Or '$(RevitVersion)' == '2019' Or '$(RevitVersion)' == '2020'" />
|
||||
<Reference Include="System.ComponentModel.DataAnnotations" Condition="'$(RevitVersion)' == '2018' Or '$(RevitVersion)' == '2019' Or '$(RevitVersion)' == '2020' " />-->
|
||||
@@ -84,34 +94,32 @@
|
||||
<PackageReference Include="CommunityToolkit.Common" Version="8.4.0" />
|
||||
<PackageReference Include="CommunityToolkit.Diagnostics" Version="8.4.0" />
|
||||
<PackageReference Include="CommunityToolkit.Mvvm" Version="8.4.0" />
|
||||
<PackageReference Include="Confuser.MSBuild" Version="1.6.0">
|
||||
<PrivateAssets>all</PrivateAssets>
|
||||
<IncludeAssets>runtime; build; native; contentfiles; analyzers; buildtransitive</IncludeAssets>
|
||||
</PackageReference>
|
||||
<PackageReference Include="EPPlus.Core.Extensions" Version="2.4.0" />
|
||||
<PackageReference Include="ACadSharp" Version="3.0.8" />
|
||||
<PackageReference Include="ACadSharp" Version="3.3.13" />
|
||||
<PackageReference Include="FuzzySharp" Version="2.0.2" />
|
||||
<PackageReference Include="HtmlAgilityPack" Version="1.12.1" />
|
||||
<!--TreatAsUsed="true"标记为已使用-->
|
||||
<PackageReference Include="Microsoft.Xaml.Behaviors.Wpf" Version="1.1.135" TreatAsUsed="True" />
|
||||
<PackageReference Include="Nice3point.Revit.Extensions" Version="2020.3.0" />
|
||||
<PackageReference Include="randomColorSharped.NetStandard" Version="1.0.2" />
|
||||
</ItemGroup>
|
||||
<!-- <ItemGroup Condition="$(DefineConstants.Contains('WINFORMS'))"> -->
|
||||
<!-- <Reference Include="System.Windows.Forms" /> -->
|
||||
<!-- </ItemGroup> -->
|
||||
<ItemGroup>
|
||||
<!--<PackageReference Include="Autodesk.Revit.SDK" Version="$(RevitVersion).*" PrivateAssets="All" />-->
|
||||
<PackageReference Include="Nice3point.Revit.Api.RevitAPI" Version="$(RevitVersion).*" PrivateAssets="All" />
|
||||
<PackageReference Include="Nice3point.Revit.Api.RevitAPIUI" Version="$(RevitVersion).*" PrivateAssets="All" />
|
||||
<PackageReference Include="Nice3point.Revit.Api.AdWindows" Version="$(RevitVersion).*" PrivateAssets="All" />
|
||||
<PackageReference Include="Nice3point.Revit.Api.RevitAPIIFC" Version="$(RevitVersion).*" PrivateAssets="All" />
|
||||
<PackageReference Include="Nice3point.Revit.Api.UIFramework" Version="$(RevitVersion).*" PrivateAssets="All" />
|
||||
<PackageReference Include="Nice3point.Revit.Api.UIFrameworkServices" Version="$(RevitVersion).*" PrivateAssets="All" />
|
||||
<!-- <PackageReference Include="Autodesk.Revit.SDK" Version="2020.*" Condition=" '$(RevitVersion)' == '2020' " PrivateAssets="All" />
|
||||
<PackageReference Include="Autodesk.Revit.SDK" Version="2025.*" Condition=" '$(RevitVersion)' == '2025' " PrivateAssets="All" />-->
|
||||
<PackageReference Include="Nice3point.Revit.Api.AdWindows" Version="$(RevitVersion).*" PrivateAssets="All" />
|
||||
<PackageReference Include="Nice3point.Revit.Toolkit" Version="2019.*" Condition=" '$(RevitVersion)' == '2018' " />
|
||||
<PackageReference Include="Nice3point.Revit.Toolkit" Version="2020.*" Condition=" '$(RevitVersion)' == '2020' " />
|
||||
<PackageReference Include="ValueConverters" Version="3.1.22" />
|
||||
<!--<PackageReference Include="Nice3point.Revit.Toolkit" Version="2025.*" Condition=" '$(RevitVersion)' == '2025' " />-->
|
||||
</ItemGroup>
|
||||
<ItemGroup>
|
||||
<ItemGroup>
|
||||
<Content Include="PackageContents.xml">
|
||||
<CopyToOutputDirectory>PreserveNewest</CopyToOutputDirectory>
|
||||
<Link>..\..\ShrlAlgoToolkit.RevitAddins.bundle\PackageContents.xml</Link>
|
||||
@@ -207,4 +215,5 @@
|
||||
<Copy SourceFiles="@(FilesToMove)" DestinationFolder="$(OutputPath)Libraries\%(RecursiveDir)" SkipUnchangedFiles="True" />
|
||||
</Target>
|
||||
<Import Project="..\ShrlAlgoToolkit.Revit\ShrlAlgoToolkit.Revit.projitems" Label="Shared" />
|
||||
|
||||
</Project>
|
||||
|
||||
@@ -1,15 +1,15 @@
|
||||
|
||||
|
||||
using System.Diagnostics;
|
||||
using System.Reflection;
|
||||
using System.Windows;
|
||||
using System.Windows.Media;
|
||||
using Autodesk.Revit.UI;
|
||||
|
||||
using Nice3point.Revit.Toolkit.External;
|
||||
using Nice3point.Revit.Toolkit.External.Handlers;
|
||||
|
||||
using ShrlAlgoToolkit.Core.Assists;
|
||||
|
||||
using ShrlAlgoToolkit.RevitAddins.Fonts;
|
||||
using ShrlAlgoToolkit.RevitAddins.ModelManager;
|
||||
|
||||
using ShrlAlgoToolkit.RevitAddins.Properties;
|
||||
using ShrlAlgoToolkit.RevitAddins.RvCivil;
|
||||
using ShrlAlgoToolkit.RevitAddins.RvCommon;
|
||||
@@ -19,12 +19,9 @@ using ShrlAlgoToolkit.RevitAddins.RvIndependent.NetworkCreator;
|
||||
using ShrlAlgoToolkit.RevitAddins.RvMEP;
|
||||
using ShrlAlgoToolkit.RevitAddins.RvView;
|
||||
|
||||
using System.Diagnostics;
|
||||
using System.Windows;
|
||||
using System.Windows.Media;
|
||||
|
||||
namespace ShrlAlgoToolkit.RevitAddins.UIRibbon;
|
||||
|
||||
//[Obfuscation(Exclude = true, ApplyToMembers = true)]
|
||||
public class RvApp : ExternalApplication
|
||||
{
|
||||
private static readonly string TabName = Settings.Default.TabName;
|
||||
|
||||
Reference in New Issue
Block a user