public static bool getFromElement(BCOM.Element element, out PenetrTaskFlange penTask) { Sp3dTask_Old task = null; penTask = null; if (!ElementHelper.getElement(element) .isElementSp3dTask_Old(out task) || !(task.isFlange())) { return(false); } penTask = new PenetrTaskFlange(element, task); return(true); }
private void findFlanges() { BCOM.CellElement cell = getTaskCell(); if (cell == null) { return; } BCOM.ModelReference taskModel = // TODO App.MdlGetModelReferenceFromModelRefP(modelRefP); BCOM.ModelReference activeModel = App.ActiveModelReference; FlangesGeom.Clear(); // Поиск фланцев BCOM.ElementScanCriteria criteria = new BCOM.ElementScanCriteriaClass(); //criteria.IncludeOnlyVisible(); criteria.ExcludeAllTypes(); criteria.ExcludeNonGraphical(); criteria.IncludeType(BCOM.MsdElementType.CellHeader); BCOM.Range3d scanRange = cell.Range; // App.Range3dScaleAboutCenter(cell.Range, 1.01); if (taskModel.IsAttachment) { double k = taskModel.UORsPerStorageUnit / activeModel.UORsPerStorageUnit; scanRange.High = App.Point3dScale(scanRange.High, k); scanRange.Low = App.Point3dScale(scanRange.Low, k); } criteria.IncludeOnlyWithinRange(scanRange); BCOM.ElementEnumerator res = taskModel.Scan(criteria); foreach (BCOM.Element current in res?.BuildArrayFromContents()) { // todo использовать только один тип точек PenetrTaskFlange flangeTask = null; //Element curEl = Element.FromElementID((ulong)current.ID, // (IntPtr)current.ModelReference.MdlModelRefP()); if (PenetrTaskFlange.getFromElement(current, out flangeTask)) { BCOM.Range3d range = current.Range; if (flangeTask.Oid.Equals(Oid)) { FlangesGeom.Add(flangeTask); } } } //BCOM.Transform3d tran = App.Transform3dInverse( // App.Transform3dFromMatrix3d(Rotation)); //cell.Transform(tran); // TODO проверить корректность transform отн. rawLocation_ transformToBase(cell, rawLocation_); if (FlangesCount != FlangesGeom.Count) { Warnings.Add(string.Format("Несоответствие количества фланцев, " + "указанных в атрибутах - {0} и заданных геометрически - {1}", FlangesCount, FlangesGeom.Count)); } if (FlangesCount == 1 && FlangesGeom.Count > 0) { BCOM.Element flangeEl = taskModel.GetElementByID(FlangesGeom[0].elemId); //flangeEl.Transform(tran); // TODO проверить корректность transform отн. rawLocation_ transformToBase(flangeEl, rawLocation_); SingleFlangeSide = App.Vector3dSubtractPoint3dPoint3d( ElementHelper.getCenter(flangeEl), ElementHelper.getCenter(cell)); } else { SingleFlangeSide = App.Vector3dFromXYZ(0, 0, -1); } }