private void DgvFields_SelectionChanged(object sender, EventArgs e) { // выделить(подсветить) объект задания в модели для пользователя selectionTranContainer?.Reset(); foreach (DataGridViewRow row in dgvFields.SelectedRows) { PenetrTask task = (PenetrTask)dgvFields.Rows[row.Index].DataBoundItem; BCOM.ModelReference modelRef = Addin.App.MdlGetModelReferenceFromModelRefP((int)task.modelRefP); BCOM.View view = ViewHelper.getActiveView(); List <long> itemsIds = new List <long> { task.elemId }; // добавляем фланцы: foreach (PenetrTaskFlange flangeTask in task.FlangesGeom) { itemsIds.Add(flangeTask.elemId); } foreach (long id in itemsIds) { BCOM.Element el = modelRef.GetElementByID(id); el.Color = 2; // зелёный el.LineWeight = 5; // для ОТЛАДКИ ************************************************* //BCOM.Transform3d taskTran; //{ // BCOM.Point3d origin = (el as BCOM.CellElement).Origin; // var shift = Addin.App.Vector3dSubtractPoint3dPoint3d( // Addin.App.Point3dZero(), task.Location); // el.Move(Addin.App.Point3dFromXYZ(shift.X, shift.Y, shift.Z)); // taskTran = Addin.App.Transform3dInverse( // Addin.App.Transform3dFromMatrix3d(task.Rotation)); // el.Transform(taskTran); // el.Move(task.Location); //} //************************************************************** selectionTranContainer.AppendCopyOfElement(el); } view.Redraw(); } }
private BCOM.CellElement getTaskCell() { BCOM.ModelReference taskModel = // TODO App.MdlGetModelReferenceFromModelRefP(modelRefP); BCOM.ModelReference activeModel = App.ActiveModelReference; bool isAttachment = taskModel.IsAttachment; BCOM.CellElement cell = taskModel.IsAttachment ? taskModel.AsAttachment.GetElementByID(elemId).AsCellElement() : taskModel.GetElementByID(elemId).AsCellElement(); return(cell); }
public void changeSelection(IEnumerable <DataRow> selection) { selectionTranCon_?.Reset(); foreach (DataRow taskRow in selection) { PenetrVueTask task = rowsToTasks_[taskRow]; BCOM.ModelReference modelRef = task.ModelRef; BCOM.View view = ViewHelper.getActiveView(); var taskUOR = new UOR(task.ModelRef); var activeUOR = new UOR(App.ActiveModelReference); List <long> itemsIds = new List <long> { task.elemId }; // добавляем фланцы: foreach (PenetrTaskFlange flangeTask in task.FlangesGeom) { itemsIds.Add(flangeTask.elemId); } foreach (long id in itemsIds) { BCOM.Element temp = modelRef.GetElementByID(id).Clone(); temp.Color = 2; // зелёный temp.LineWeight = 5; #if CONNECT // для версии CONNECT требуется поправка // в V8i возмоно она производится автоматически BCOM.Attachment attachment = task.getAttachment(); if (attachment != null) { temp.Transform(attachment.GetReferenceToMasterTransform()); } #endif selectionTranCon_.AppendCopyOfElement(temp); } } }
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); } }
/// <summary> /// Поиск фланцев на объекте задания старого типа /// </summary> private void findFlangesOld() { BCOM.ModelReference model = App.MdlGetModelReferenceFromModelRefP(modelRefP); SingleFlangeSide = App.Vector3dZero(); // Todo из правильной модели BCOM.CellElement cell = model.GetElementByID(elemId).AsCellElement(); if (cell == null) { return; } //var tran = App.Transform3dFromMatrix3d(Rotation); //if (App.Matrix3dHasInverse(Rotation)) //{ // tran = App.Transform3dInverse(tran); //} //var tran = App.Transform3dInverse( // App.Transform3dFromMatrix3d(Rotation)); //cell.Transform(tran); // TODO проверить корректность transform отн. rawLocation_ transformToBase(cell, rawLocation_); var cones = new List <BCOM.ConeElement>(); collectSubElementsByType(cell, ref cones); //var iter = bcomEl.AsCellElement().GetSubElements(); //while (iter.MoveNext()) //{ // var iterSub = iter.Current.AsCellElement().GetSubElements(); // while (iterSub.MoveNext()) // { // if (iterSub.Current.IsConeElement()) // cones.Add(iterSub.Current.AsConeElement()); // } //} cones.Sort((BCOM.ConeElement lhs, BCOM.ConeElement rhs) => { return(-1 * ElementHelper.getHeight(lhs).CompareTo( ElementHelper.getHeight(rhs))); }); /* cones.Count == * 2: без фланцев * 4: 1 фланец, определяем вектор с какой стороны фланец * 6: 2 фланца */ int geomFlangesCount = cones.Count / 2 - 1; if (geomFlangesCount == 1) { // 1 фланец, определяем вектор с какой стороны фланец относительно центра SingleFlangeSide = App.Vector3dSubtractPoint3dPoint3d( ElementHelper.getCenter(cones[2]), ElementHelper.getCenter(cones[0])); } else { // базовая ориентация при построении // фланец совпадает с Точкой установки SingleFlangeSide = App.Vector3dFromXYZ(0, 0, -1); } if (FlangesCount != geomFlangesCount) { Warnings.Add(string.Format("Несоответствие количества фланцев, " + "указанных в атрибутах - {0} и заданных геометрически - {1}", FlangesCount, geomFlangesCount)); } }