Files
MsAddIns/ShrlAlgo.MsAddIns/Commands.cs
2026-02-28 21:01:57 +08:00

645 lines
26 KiB
C#
Raw Permalink Blame History

This file contains ambiguous Unicode characters
This file contains Unicode characters that might be confused with other characters. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.
using System;
using System.Collections.Generic;
using System.Collections.ObjectModel;
using System.IO;
using System.Linq;
using System.Net.NetworkInformation;
using System.Reflection;
using System.Text;
using System.Windows;
using System.Windows.Media.Media3D;
using Bentley.DgnPlatformNET;
using Bentley.DgnPlatformNET.Elements;
using Bentley.DgnPlatformNET.SmartFeature;
using Bentley.ECObjects.Instance;
using Bentley.ECObjects.Schema;
using Bentley.GeometryNET;
using Bentley.MstnPlatformNET;
using CenterCurveAddins;
using CustomOpenItemAddins;
using Microsoft.Win32;
using Mstn.Toolkit.Extensions;
using Mstn.Toolkit.External;
using Mstn.Toolkit.Helpers;
using Newtonsoft.Json;
using QuickModeling;
using QuickModeling.Models;
using QuickModeling.ViewModels;
using QuickModeling.Views;
using TunnelZYJSCSAddins;
using ZYJSCSMsAddins;
//using static Bentley.DgnPlatformNET.DropGeometry;
//using MstnMixedAssistant;
namespace ShrlAlgo.MsAddIns
{
internal class Commands
{
public static Element Union(List<Element> elements)
{
var dgnModel = Session.Instance.GetActiveDgnModel();
Element resultElem = default;
SolidKernelEntity target = default;
List<SolidKernelEntity> solidKernels = new List<SolidKernelEntity>();
foreach (Element elem in elements)
{
resultElem = elem;
var status = Convert1.ElementToBody(out var entity, elem, true, false, false);
if (status == BentleyStatus.Success)
{
solidKernels.Add(entity);
target = entity;
}
}
try
{
var array = solidKernels.ToArray();
var status = Modify.BooleanUnion(ref target, ref array, 1);
if (status == BentleyStatus.Success)
{
Convert1.BodyToElement(out resultElem, target, null, dgnModel);
resultElem.AddToModel();
}
else
{
MessageCenter.Instance.ShowInfoMessage("合并实体失败", $"", false);
}
}
catch (Exception ex)
{
MessageCenter.Instance.ShowInfoMessage("异常", $"{ex.Message}", false);
}
return resultElem;
}
private static Assembly CurrentDomain_AssemblyResolve(object sender, ResolveEventArgs args)
{
var assemblyName = new AssemblyName(args.Name).Name;
var assemblyPath = Path.Combine(Path.GetDirectoryName(Assembly.GetExecutingAssembly().Location), $"{assemblyName}.dll");
if (File.Exists(assemblyPath))
{
return Assembly.LoadFrom(assemblyPath);
}
return null;
}
/// <summary>
/// 修改单位和数值
/// </summary>
/// <param name="elem"></param>
private static void ModifyUnit(Element elem)
{
var dgnFile = Session.Instance.GetActiveDgnFile();
var host = new CustomItemHost(elem, false).CustomItems;
foreach (var instance in host)
{
var ecClass = instance.ClassDefinition;
var label = ecClass.DisplayLabel;
var lib = ecClass.Schema;
var libLabel = lib.DisplayLabel;
ItemTypeLibrary itemTypeLibrary = ItemTypeLibrary.FindByName(libLabel, dgnFile);
var itemType = itemTypeLibrary.GetItemTypeByName(label);
if (instance.ContainsValues)
{
foreach (var propValue in instance)
{
if (propValue.TryGetNativeValue(out var value))
{
var prop = propValue.Property;
var propDefin = itemType.GetPropertyByName(prop.Name);
var units = propDefin.Units;
if (units.ECUnitName == "MILLIMETRE")
{
instance.SetValue(prop.DisplayLabel, propValue.DoubleValue / 1000.0);
propDefin.Units = new DgnECUnit("METRE");
itemType.Library.Write();
instance.WriteChanges();
}
}
}
}
}
}
/// <summary>
/// 通过属性名设置属性值,多个同名属性会同时设置
/// </summary>
/// <param name="elem">元素</param>
/// <param name="propName">属性名</param>
/// <returns></returns>
private static void SetECPropertyValues(Element elem, string propName, object value)
{
var instances = new CustomItemHost(elem, false).CustomItems;
try
{
foreach (var instance in instances)
{
instance.SetValue(propName, value);
instance.WriteChanges();
}
}
catch (Exception)
{
}
}
public static void Command(string unparsed)
{
//RingPlacementAddin.Commands.PlaceRings(string.Empty);
//return;
//long elementId = Convert.ToInt64(3159);
//var elem = Session.Instance.GetActiveDgnModel().FindElementById(new ElementId(ref elementId));
//var tran1 = DTransform3d.Rotation(0, Angle.FromDegrees(0.53));
//var tran2 = DTransform3d.Rotation(1, Angle.FromDegrees(149));
//var tran3 = DTransform3d.Rotation(2, Angle.FromDegrees(-179));
//var d1 = DTransform3d.Multiply(tran2, tran3);
//var d2 = DTransform3d.Multiply(tran1, d1);
//var d1 = DTransform3d.Multiply(tran2, tran1);
//var d2 = DTransform3d.Multiply(tran3, d1);
//return;
#if false
OpenFileDialog dialog = new OpenFileDialog()
{
Filter = "管环定位配置 (*.json)|*.json",
Title = "打开文件",
Multiselect = false,
InitialDirectory = Environment.GetFolderPath(Environment.SpecialFolder.Desktop)
};
if (dialog.ShowDialog() == true)
{
var jsonFilePath = dialog.FileName;
try
{
RingInfoList rings = RingInfoReader.Read(jsonFilePath);
var dir = Path.GetDirectoryName(Assembly.GetExecutingAssembly().Location);
var cellPath = Path.Combine(dir, "Cell", "Ring.cel");
if (!File.Exists(cellPath))
{
MessageBox.Show($"单元库文件不存在:{cellPath}", "错误", MessageBoxButton.OK, MessageBoxImage.Error);
return;
}
//DTransform3d trans = DTransform3d.Identity;
//trans.Translation = new DVector3d(100000, 200000, 300000);
//var ts = DTransform3d.Rotation(DVector3d.FromXYZ(1000, 0, 0), Angle.PI * 0.25);
//var ts1 = DTransform3d.Multiply(ts, trans);
//var matrix3d = ts1.Matrix;
//var de = matrix3d.Determinant();
//var rigid = matrix3d.IsRigid();//刚性
//var diagonal = matrix3d.IsDiagonal();//对角线
//var orthogonal = matrix3d.IsOrthogonal();//正交
//var uniform = matrix3d.IsUniformScale(out var max);
//var rigidWithScale = matrix3d.IsRigidWithScale(out var maxtric, out var s);
double uorMeter = Session.Instance.GetActiveDgnModel().GetModelInfo().UorPerMeter;
Dictionary<string, object> parameters = new()
{
{ "管片宽度", 1.2}, //转换为米
};
//CellHelpers.ImportParametricCellElement(cellPath, "管环", ts1);
//return;
foreach (var ring in rings.Rings)
{
//var b1 = ring.Transform3d.IsDiagonal();
//DTransform3d trans = DTransform3d.Identity;
//trans.Translation = ring.Transform3d.Translation; //UOR unit
CellHelper.ImportParametricCellElement(cellPath, "管环", ring.Transform3d, parameters);
}
//CellHelpers.AttachCellLib(cellPath);
//foreach (var ring in rings.Rings)
//{
// CellHelpers.CreateParametricCell("管环", null, ring.Transform3d);
//}
//CellHelpers.DetachCellLibs();
}
catch (Exception ex)
{
MessageBox.Show(ex.Message);
}
}
return;
#endif
//var agenda = new ElementAgenda();
//SelectionSetManager.BuildAgenda(ref agenda);
//var element = agenda.GetFirst();
#if False
AppDomain.CurrentDomain.AssemblyResolve -= CurrentDomain_AssemblyResolve;
AppDomain.CurrentDomain.AssemblyResolve += CurrentDomain_AssemblyResolve;
try
{
ConfigurationPropsAttachView attachView = new ConfigurationPropsAttachView();
//让窗口始终在应用程序顶部
attachView.Owner = Application.Current.MainWindow;
attachView.DataContext = new ConfigurationPropsAttachViewModel();
attachView.Show();
}
catch (Exception ex)
{
MessageBox.Show(ex.Message);
}
//finally
//{
// AppDomain.CurrentDomain.AssemblyResolve -= CurrentDomain_AssemblyResolve;
//}
return;
#endif
//JsonConvert.SerializeObject(configs, Formatting.Indented);
//return;
#if false
//OpenFileDialog openFileDialog = new OpenFileDialog
//{
// Filter = "DGN Files (*.dgn)|*.dgn|All Files (*.*)|*.*",
// Title = "选择DGN文件"
//};
//if (openFileDialog.ShowDialog() == true)
//{
// string filePath = openFileDialog.FileName;
// var schema = SchemaHelpers.DefineECSchemaFromXml(filePath);
// SchemaHelpers.ImportSchema(schema);
//}
AppDomain.CurrentDomain.AssemblyResolve += CurrentDomain_AssemblyResolve;
ConfigurationPropsAttachView view = new();
view.Show();
AppDomain.CurrentDomain.AssemblyResolve -= CurrentDomain_AssemblyResolve;
return;
#endif
#if false
var cs = ZYJSCSHelpers.GetDataByLevelName("JG_ZYJSCS");
StringBuilder sb = new StringBuilder();
foreach (var model in cs)
{
sb.AppendLine($"{model.Name},{model.Measurement},{model.Result}");
}
MessageBox.Show(sb.ToString());
return;
#endif
//List<Element> elements = GetSelectedElements();
//中线
#if true
StringBuilder sb = new StringBuilder();
//var dgnModel = Session.Instance.GetActiveDgnModel();
//var elements = dgnModel.GetElements().Where(e => e is not MeshHeaderElement && e.GetLevel().DisplayName == "JG_ZYJSCS").ToList();
//var resultelement = Union(elements);
//var volume = CustomOpenItemHelpers.GetPropertiesByName(resultelement, "Volume")?.FirstOrDefault();
//if (volume != null)
//{
// var uorMeter = dgnModel.GetModelInfo().UorPerMeter;
// volume.TryGetNativeValue(out var value);
// double d = Convert.ToDouble(value) / (uorMeter * uorMeter * uorMeter);
//}
Dictionary<Element, double> dic = TunnelLengthHelper.GetMeshProjectLength("XL_ZXX");
var total = 0.0;
string str = string.Empty;
try
{
int n = 0;
foreach (var item in dic)
{
sb.AppendLine($"{n + 1} 元素ID{item.Key.ElementId}--投影长度:{item.Value}");
n++;
total += item.Value;
str += item.Key.ElementId + ";";
}
//MessageBox.Show(sb.ToString());
}
catch (Exception)
{
throw;
}
sb.AppendLine($"合计:{total}");
sb.AppendLine(str);
MessageBox.Show(sb.ToString());
return;
#endif
#if false
DgnModelRef dgnModelRef = Session.Instance.GetActiveDgnModelRef();
StringBuilder sb = new StringBuilder();
//dgnModel.GetLevelCache().GetLevelByName("JG_ZYJSCS");
try
{
var dict1 = CustomOpenItemHelpers.GetCutstomItemByLevelName("JG_ZYJSCS");
var dict = TunnelZYJSCSHelpers.GetDataByLevelName("JG_ZYJSCS");
var v = dict.Values.FirstOrDefault(item => !string.IsNullOrEmpty(item.Formula));
foreach (var item in dict)
{
sb.AppendLine($"{item.Key}:{item.Value}");
}
LogHelper.WriteLine(sb.ToString());
var result = v?.Result;
}
catch (Exception)
{
}
return;
#endif
//获取当前选择的元素集
//var agenda = new ElementAgenda();
//SelectionSetManager.BuildAgenda(ref agenda);
//var element = agenda.GetFirst();
////var elementId = long.Parse("65256");
////var element = dgnModel.FindElementById(new ElementId(ref elementId));
//var value = element.GetProperyValues("Volume").FirstOrDefault();
//var val = element.GetProperyValues("体积").FirstOrDefault();
SelectElementTest();
//CustomTool.InstallNewTool();
//UserPickTool.Setup(e => true, e =>
//{
// StringBuilder sb = new();
// for (uint i = 0; i < e.GetCount(); i++)
// {
// var elem = e.GetEntry(i);
// var host = new CustomItemHost(elem, false);
// var instances = host.CustomItems;
// //host.CopyCustomItems(host.CustomItems, false);
// foreach (var lib in instances)
// {
// var str = lib.GetType().FullName;
// }
// //elem.AttachItemType()
// }
//});
//var data = ZYJSCSHelpers.GetCutstomItemLevelName("JG_ZYJSCS");
//var path = Path.Combine(Environment.GetFolderPath(Environment.SpecialFolder.Desktop), "算量.txt");
//foreach (var model in data)
//{
// //SharedCellElement
// //sb.AppendLine($"{model.Name}-{model.MeasurementStr}-{model.Result}");
// //var d = model.Result;
// //var str = model.Message?.ToString();
// File.AppendAllText(path, $"{model.Name}-{model.MeasurementStr}-{model.Result}\n");
//}
return;
#if false
UserPickTool.Setup(
e => true,
e =>
{
for (uint i = 0; i < e.GetCount(); i++)
{
var elem = e.GetEntry(i);
var count = elem.GetChildren();
ChildElementEnumerator enumeratorPro = new ChildElementEnumerator(elem);
List<Element> childElementsPro = new List<Element>();
while (enumeratorPro.MoveNext())
{
if (enumeratorPro.Current != null)
{
childElementsPro.Add(enumeratorPro.Current);
}
}
DgnModel dgnModel = Session.Instance.GetActiveDgnModel();
//var items = dgnModel.GetGraphicElements();
//var filters = items.Where(e => e.ParentElement.ElementId == elem.ElementId);
//GraphicProcessor process = new GraphicProcessor();
if (elem is ExtendedElementElement extended)
{
var list = extended.GetChildren();
SolidKernelEntity entity = null;
Element newElement = null;
var status = SmartFeatureUtil.GetSolidKernelEntity(ref entity, elem);
if (SmartFeatureElement.IsSmartFeature(elem))
{
var c = SmartFeatureElement.GetSmartFeatureDependentCount(extended);
try
{
var statusInt = SmartFeatureElement.GetOrCreateSmartFeature(
ref newElement,
null,
dgnModel,
elem,
true,
true,
true,
true);
}
catch (Exception)
{
}
}
}
//ElementGraphicsOutput.Process(elem, process);
}
});
UserPickTool.Setup(
e => e is MeshHeaderElement,
a =>
{
for (uint i = 0; i < a.GetCount(); i++)
{
//long l = Convert.ToInt32(unparsed);
//var id = new ElementId(ref l);
//var elem = dgnModel.FindElementById(id);
var elem = a.GetEntry(i) as MeshHeaderElement;
//int[] iArrMeshDivide = { };//元素id
//bool bRet = ClrCode.GeneralToolClr.DivideMesh(elem.ElementId.GetHashCode(), ref iArrMeshDivide);
//if (bRet && iArrMeshDivide.Count() > 0)
//{
// var sb = new StringBuilder();
// int n = 1;
// foreach (var iEle in iArrMeshDivide)
// {
// ulong lEle = (ulong)iEle;
// var id = new ElementId(ref lEle);
// var elemSub = Session.Instance.GetActiveDgnModel().FindElementById(id);
// //sb = elem.ReadAllProperties();
// sb.AppendLine(
// $"{n}、图层ID{elem.LevelId},图层:{elem.GetLevel().DisplayName}元素ID{elem.ElementId},元素类型名称:{elemSub.TypeName},元素描述:{elem.Description},元素类型:{elem.ElementType}\n");
// File.WriteAllText(
// Path.Combine(Environment.GetFolderPath(Environment.SpecialFolder.Desktop), "元素集.txt"),
// sb.ToString());
// }
//}
try
{
//var pots = TunnelLengthHelper.GetBoundariesFromMeshByProject(elem);
//ElementCreationHelpers.CreateShape(pots.ToArray());
}
catch (Exception ex)
{
MessageCenter.Instance.ShowInfoMessage(ex.Message, ex.StackTrace, false);
}
}
});
#endif
}
private static void SelectElementTest()
{
UserPickTool.Setup(e => true, e =>
{
List<Element> elems = new List<Element>();
//StringBuilder sb = new();
for (uint i = 0; i < e.GetCount(); i++)
{
var elem = e.GetEntry(i);
elems.Add(elem);
//ModifyUnit(elem);
//var count = elem.GetChildren();
//if (elem is SharedCellElement sharedCell)
//{
// DropGeometry geom = new DropGeometry();
// geom.SetOptions(DropGeometry.Options.OPTION_SharedCells);
// geom.SetSharedCellOptions(DropGeometry.SharedCells.SHAREDCELL_Geometry);
// ElementAgenda agenda = new ElementAgenda();
// var status = MstnMixedAssistant.ElementOperation.DropElement(elem, out agenda, geom);
// if (status == StatusInt.Success)
// {
// for (uint j = 0; j < agenda.GetCount(); j++)
// {
// var elem = agenda.GetEntry(j);
// }
// }
// //var definition = sharedCell.GetDefinition(Session.Instance.GetActiveDgnFile());
// //foreach (var child in definition.GetChildren())
// //{
// //}
//}
//var l = elem.GetLevel().DisplayName;
//MessageBox.Show(l);
//sb.AppendLine($"Id:{elem.ElementId}");
//sb.AppendLine($"Type:{elem.GetType().FullName}");
//sb.AppendLine($"ElementType:{elem.ElementType}");
//sb.AppendLine($"Description:{elem.Description}");
//elem.ReadAllProperties();
}
var groups = elems.GroupBy(e => e.GetProperyValues("土岩分类").FirstOrDefault().StringValue);
var list = new Dictionary<string, string>();
StringBuilder sb = new StringBuilder();
foreach (var g in groups)
{
sb.AppendLine(g.Key);
double volume = 0;
foreach (var elem in g)
{
var temp = elem.GetProperyValues("Volume").FirstOrDefault().DoubleValue / (Session.Instance.GetActiveDgnModel().GetModelInfo().UorPerMeter * Session.Instance.GetActiveDgnModel().GetModelInfo().UorPerMeter * Session.Instance.GetActiveDgnModel().GetModelInfo().UorPerMeter);
volume += temp;
sb.AppendLine($"元素ID:{elem.ElementId}--元素描述:{elem.Description}--体积:{temp}");
//list.Add(g.Key + volume, );
}
sb.AppendLine($"总体积:{volume}");
}
//foreach (var item in list)
//{
// sb.AppendLine($"{item.Key}");
// foreach (var el in item.Value)
// {
// sb.AppendLine($"{el.ElementId}");
// }
//}
MessageBox.Show(sb.ToString());
});
}
private static void ExportItemTypeToJson()
{
var libs = QuickModeling.ItemTypesHelpers.GetItemTypeLibraries();
var configs = new List<ComponentConfig>();
AppDomain.CurrentDomain.AssemblyResolve += CurrentDomain_AssemblyResolve;
try
{
foreach (var lib in libs)
{
ComponentConfig config = new ComponentConfig()
{
ComponentType = ComponentType.SegmentRing,
Guid = Guid.NewGuid(),
Name = lib.Name,
};
config.Parameters = new ObservableCollection<Parameter>();
//通过Ascii判断是否是英文字母开头
char firstChar = lib.Name[0];
if ((firstChar < 'A' || firstChar > 'Z') && (firstChar < 'a' || firstChar > 'z'))
{
foreach (var item in lib.ItemTypes)
{
var props = QuickModeling.ItemTypesHelpers.GetProperties(item);
foreach (var prop in props)
{
Parameter paramter = new Parameter()
{
Group = item.Name,
Name = prop.Name,
DataType = (TypeKind)prop.Type,
Value = prop.DefaultValue,
};
config.Parameters.Add(paramter);
}
}
}
configs.Add(config);
}
var jsonStr = JsonConvert.SerializeObject(configs, Formatting.Indented);
string path = Path.Combine(Environment.GetFolderPath(Environment.SpecialFolder.Desktop), "Configs", "Configurations.json");
if (!File.Exists(path))
{
File.Create(path).Close();
}
File.WriteAllText(path, jsonStr);
}
catch (Exception ex)
{
MessageBox.Show(ex.Message);
}
AppDomain.CurrentDomain.AssemblyResolve -= CurrentDomain_AssemblyResolve;
}
}
}