diff --git a/src/CAD/IFox.CAD.Shared/ExtensionMethod/CurveEx.cs b/src/CAD/IFox.CAD.Shared/ExtensionMethod/CurveEx.cs index bfca634af56a45f77ea2c10de9f2b389c60bcb06..f8b83b5ece2607d2b438588b8b66d6063471c1aa 100644 --- a/src/CAD/IFox.CAD.Shared/ExtensionMethod/CurveEx.cs +++ b/src/CAD/IFox.CAD.Shared/ExtensionMethod/CurveEx.cs @@ -207,6 +207,77 @@ public static List BreakCurve(this List curves) return newCurves; } + /// + /// 在z法向量平面打断曲线 + /// + /// 曲线列表 + /// 打断后的曲线列表 + /// 传入的曲线列表错误 + public static List BreakCurveOnZPlane(this List curves) + { + if (curves is null) + throw new ArgumentNullException(nameof(curves)); + var zPlane = new Plane(Point3d.Origin, Vector3d.ZAxis); + var curvesTemp = curves.Select(c => c.GetProjectedCurve(zPlane, Vector3d.ZAxis)).ToList(); + var geCurves = new List(); // 存储曲线转换后的复合曲线 + var paramss = new List>(); // 存储每个曲线的交点参数值 + + for (int i = 0; i < curvesTemp.Count; i++) + { + paramss.Add(new HashSet()); + var cc3d = curvesTemp[i].ToCompositeCurve3d(); + if (cc3d is not null) + { + geCurves.Add(cc3d); + } + } + var newCurves = new List(); + var cci3d = new CurveCurveIntersector3d(); + + for (int i = 0; i < curvesTemp.Count; i++) + { + var gc1 = geCurves[i]; + var pars1 = paramss[i]; // 引用 + for (int j = i; j < curvesTemp.Count; j++) + { + var gc2 = geCurves[j]; + var pars2 = paramss[j]; // 引用 + + cci3d.Set(gc1, gc2, Vector3d.ZAxis); + + for (int k = 0; k < cci3d.NumberOfIntersectionPoints; k++) + { + var pars = cci3d.GetIntersectionParameters(k); + pars1.Add(pars[0]); // 引用修改会同步到源对象 + pars2.Add(pars[1]); // 引用修改会同步到源对象 + } + } + var curNow = curvesTemp[i]; + var length = curNow.GetLength(); + List np = pars1.Where(p => p >= 0 && p <= length) + .Select(curNow.GetParameterAtDistance) + .Where(p => !(Math.Abs(p - curNow.StartParam) < 1e-6 || Math.Abs(p - curNow.EndParam) < 1e-6)) + .ToList(); + if (np.Count > 0) + { + var splitCurs = curNow.GetSplitCurves(np, true); + if (splitCurs.Count() > 1) + { + newCurves.AddRange(splitCurs); + } + else + { + newCurves.Add(curNow.CloneEx()); + } + } + else + { + newCurves.Add(curNow.CloneEx()); + } + } + + return newCurves; + } // 转换DBCurve为GeCurved #region Curve diff --git a/src/CAD/IFox.CAD.Shared/ExtensionMethod/DBDictionaryEx.cs b/src/CAD/IFox.CAD.Shared/ExtensionMethod/DBDictionaryEx.cs index 3942b6ccab7092955df5b69b7978c814363eddac..66fe217a7f41893e93890a55a61b93492d14bb1b 100644 --- a/src/CAD/IFox.CAD.Shared/ExtensionMethod/DBDictionaryEx.cs +++ b/src/CAD/IFox.CAD.Shared/ExtensionMethod/DBDictionaryEx.cs @@ -18,9 +18,8 @@ public static IEnumerable GetAllObjects(this DBDictionary dict) where T : var tr = DBTrans.GetTopTransaction(dict.Database); foreach (DBDictionaryEntry e in dict) { - var ent = tr.GetObject(e.Value, OpenMode.ForRead); - if (ent is not null) - yield return ent; + if(tr.GetObject(e.Value) is T tobj) + yield return tobj; } } diff --git a/src/CAD/IFox.CAD.Shared/ExtensionMethod/JigExTransient.cs b/src/CAD/IFox.CAD.Shared/ExtensionMethod/JigExTransient.cs index c7532b98ef14c1eecb49358b27cfbbea396f3442..9d3bf6b2d04f06ddf4d2528e2f7288293804db47 100644 --- a/src/CAD/IFox.CAD.Shared/ExtensionMethod/JigExTransient.cs +++ b/src/CAD/IFox.CAD.Shared/ExtensionMethod/JigExTransient.cs @@ -8,9 +8,10 @@ public class JigExTransient : IDisposable { #region 私有字段 // 整数集,暂时不知道有什么意义 - IntegerCollection _integerCollection; + readonly IntegerCollection _integerCollection; // 维护集合 - HashSet _entities; + readonly HashSet _entities; + readonly TransientManager _manager; #endregion #region 公开属性 @@ -31,7 +32,8 @@ public class JigExTransient : IDisposable public JigExTransient() { _integerCollection = new(); - _entities = new(); + _entities = new(); + _manager=TransientManager.CurrentTransientManager; } #endregion @@ -55,9 +57,7 @@ public void Add(Entity ent, TransientDrawingMode tdm = TransientDrawingMode.Main { if (_entities.Add(ent)) { - TransientManager - .CurrentTransientManager - .AddTransient(ent, tdm, 128, _integerCollection); + _manager.AddTransient(ent, tdm, 128, _integerCollection); } } @@ -70,9 +70,7 @@ public void Remove(Entity ent) { if (!Contains(ent)) return; - TransientManager - .CurrentTransientManager - .EraseTransient(ent, _integerCollection); + _manager.EraseTransient(ent, _integerCollection); _entities.Remove(ent); } @@ -83,9 +81,7 @@ public void Clear() { foreach (var ent in _entities) { - TransientManager - .CurrentTransientManager - .EraseTransient(ent, _integerCollection); + _manager.EraseTransient(ent, _integerCollection); } _entities.Clear(); } @@ -99,9 +95,7 @@ public void Update(Entity ent) { if (!Contains(ent)) return; - TransientManager - .CurrentTransientManager - .UpdateTransient(ent, _integerCollection); + _manager.UpdateTransient(ent, _integerCollection); } /// diff --git a/src/CAD/IFox.CAD.Shared/ExtensionMethod/SymbolTableRecordEx.cs b/src/CAD/IFox.CAD.Shared/ExtensionMethod/SymbolTableRecordEx.cs index 5a9cdf773c033152fd06799115b61b8eaab17114..15181596a6e06e0a778919652fcc8c8d2e7f47b8 100644 --- a/src/CAD/IFox.CAD.Shared/ExtensionMethod/SymbolTableRecordEx.cs +++ b/src/CAD/IFox.CAD.Shared/ExtensionMethod/SymbolTableRecordEx.cs @@ -119,7 +119,7 @@ public static IEnumerable AddEntity(this BlockTableRecord btr, IEnu /// 对象 id 列表 public static IEnumerable AddEntity(this BlockTableRecord btr, params Entity[] ents) { - return btr.AddEntity(ents); + return btr.AddEntity(ents.ToList()); } #endregion diff --git a/src/CAD/IFox.CAD.Shared/Runtime/DBTrans.cs b/src/CAD/IFox.CAD.Shared/Runtime/DBTrans.cs index b185b76d6e9ffa815cfa451884f94642a8aff8bd..b685cc5d2f9493dd94d42b7e79433f12e042fd64 100644 --- a/src/CAD/IFox.CAD.Shared/Runtime/DBTrans.cs +++ b/src/CAD/IFox.CAD.Shared/Runtime/DBTrans.cs @@ -390,6 +390,21 @@ public static implicit operator Transaction(DBTrans tr) #region 获取对象 /// + /// 根据对象id获取对象 + /// + /// 对象id + /// 打开模式,默认为只读 + /// 是否打开已删除对象,默认为不打开 + /// 是否打开锁定图层对象,默认为不打开 + /// 数据库DBObject对象 + public DBObject GetObject(ObjectId id, + OpenMode openMode = OpenMode.ForRead, + bool openErased = false, + bool openLockedLayer = false) + { + return Transaction.GetObject(id, openMode, openErased, openLockedLayer); + } + /// /// 根据对象id获取图元对象 /// /// 要获取的图元对象的类型