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 elements) { var dgnModel = Session.Instance.GetActiveDgnModel(); Element resultElem = default; SolidKernelEntity target = default; List solidKernels = new List(); 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; } /// /// 修改单位和数值 /// /// 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(); } } } } } } /// /// 通过属性名设置属性值,多个同名属性会同时设置 /// /// 元素 /// 属性名 /// 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 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 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 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 childElementsPro = new List(); 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 elems = new List(); //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(); 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(); 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(); //通过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; } } }