Beispiel #1
0
        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();
            }
        }
Beispiel #2
0
        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);
        }
Beispiel #3
0
        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);
                }
            }
        }
Beispiel #4
0
        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);
            }
        }
Beispiel #5
0
        /// <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));
            }
        }