Как найти взаимосвязь между IDrawingObject и IEdge ?

Автор anton.gorschnev, 26.09.24, 16:20:10

« назад - далее »

0 Пользователи и 1 гость просматривают эту тему.

anton.gorschnev

Как понять какому объекту созданном в эскизе детали какое ребро соответствует
Создаем эскиз
   internal void CreateSweepBottom()
       {
   #region Создание эскиза
            ISketch sketch = IModelContainer_.Sketchs.Add();
            part7 = document3D.TopPart;
            sketch.Plane = part7.DefaultObject[ksObj3dTypeEnum.o3d_planeXOY];
            sketch.Hidden = false;
            sketch.Angle = 90.0;
            sketch.LeftHandedCS = true;
            sketch.Update();

           
            //Войти в режим редактирования эскиза
            IKompasDocument2D document2D = sketch.BeginEdit();
            IKompasDocument2D1 IKompasDocument2D1_ = (IKompasDocument2D1)document2D;
            IViewsAndLayersManager viewsAndLayersManager = document2D.ViewsAndLayersManager;
            IDrawingContainer drawingContainer = (IDrawingContainer)viewsAndLayersManager.Views.ActiveView;



            ICircle[] ICircle_ = new ICircle[2];
            ILineSegment[] ILineSegment_ = new ILineSegment[2];
            ISymbols2DContainer symbols2dContainer = (ISymbols2DContainer)viewsAndLayersManager.Views.ActiveView;
            #endregion
 ICircle_[0] = Circle(sketch, 1000, "Diameter", "Диаметр", symbols2dContainer, drawingContainer);

ILineSegment[0]=LineOnCentr(sketch, drawingContainer, ICircle_[0]);

 sketch.EndEdit();
       }


  private ICircle Circle(ISketch sketch, double Diameter, string NameParam, string ComentParam, ISymbols2DContainer symbols2dContainer, IDrawingContainer drawingContainer)
        {
            //переменная под  диаметр
            IVariable7 Variable_ = IFeature7_.Variable[true, true, NameParam];
            if (Variable_ == null)
            {
                Variable_ = part7.AddVariable(NameParam, Diameter, ComentParam);
                Variable_.External = true;
            }
            //Окружность развертки
            ICircle ICircle_ = drawingContainer.Circles.Add();
            ICircle_.Style = (int)Kompas6Constants.ksCurveStyleEnum.ksCSNormal;
            ICircle_.Xc = 0;
            ICircle_.Yc = 0;
            ICircle_.Radius = Diameter / 2;
            ICircle_.Update();
            //назначить фиксацию центра
            IDrawingObject1 IDrawingObject1_ = (IDrawingObject1)ICircle_;
            IParametriticConstraint IParametriticConstraint_ = IDrawingObject1_.NewConstraint();
            IParametriticConstraint_.ConstraintType = ksConstraintTypeEnum.ksCFixedPoint;
            IParametriticConstraint_.Index = 0;
            IParametriticConstraint_.Create();


            //нанесение размера диаметра
            IDiametralDimension IDiametralDimension_ = symbols2dContainer.DiametralDimensions.Add();
            IDiametralDimension_.BaseObject = ICircle_;
            IDiametralDimension_.Update();

            IDrawingObject1_ = (IDrawingObject1)IDiametralDimension_;
            IParametriticConstraint_ = IDrawingObject1_.NewConstraint();

            //фиксированный размер     
            IParametriticConstraint_ = IDrawingObject1_.NewConstraint();
            IParametriticConstraint_.ConstraintType = Kompas6Constants.ksConstraintTypeEnum.ksCFixedDim;
            IParametriticConstraint_.Create();

            //управляющая переменная размера
            IParametriticConstraint_ = IDrawingObject1_.NewConstraint();
            IParametriticConstraint_.ConstraintType = Kompas6Constants.ksConstraintTypeEnum.ksCDimWithVariable;
            IParametriticConstraint_.Expression = NameParam;
            IParametriticConstraint_.Comment = ComentParam;
            IParametriticConstraint_.Create();
            return ICircle_;
        }

 private ILineSegment LineOnCentr(ISketch sketch, IDrawingContainer drawingContainer, ICircle ICircle_)
        {
            //шов по центру через все днище
            ILineSegment ILineSegment_ = drawingContainer.LineSegments.Add();
            ILineSegment_.Style = (int)Kompas6Constants.ksCurveStyleEnum.ksCSNormal;
            ILineSegment_.X1 = 0;
            ILineSegment_.Y1 = ICircle_.Radius;
            ILineSegment_.X2 = 0;
            ILineSegment_.Y2 = -ICircle_.Radius;
            ILineSegment_.Update();
            //назначить вертикальность
            IDrawingObject1 IDrawingObject1_ = (IDrawingObject1)ILineSegment_;
            IParametriticConstraint IParametriticConstraint_ = IDrawingObject1_.NewConstraint();
            IParametriticConstraint_.ConstraintType = ksConstraintTypeEnum.ksCVertical;
            IParametriticConstraint_.Create();
            //назначить совпадение точек
            IParametriticConstraint_ = IDrawingObject1_.NewConstraint();
            IParametriticConstraint_.ConstraintType = ksConstraintTypeEnum.ksCPointOnCurve;
            IParametriticConstraint_.Index = 0;
            IParametriticConstraint_.Partner = ICircle_;
            IParametriticConstraint_.Create();

            IParametriticConstraint_ = IDrawingObject1_.NewConstraint();
            IParametriticConstraint_.ConstraintType = ksConstraintTypeEnum.ksCPointOnCurve;
            IParametriticConstraint_.Index = 1;
            IParametriticConstraint_.Partner = ICircle_;
            IParametriticConstraint_.Create();

            IDrawingObject1_ = (IDrawingObject1)ICircle_;
            IParametriticConstraint_ = IDrawingObject1_.NewConstraint();
            IParametriticConstraint_.ConstraintType = ksConstraintTypeEnum.ksCPointOnCurve;
            IParametriticConstraint_.Index = 0;
            IParametriticConstraint_.Partner = ILineSegment_;
            IParametriticConstraint_.Create();
            return ILineSegment_;
        }

 

Возврат ребер с эскиза

IFeature7 _IFeature7 = (IFeature7)IModelContainer_.Sketchs.Sketch[0];
            object[] iObject_ = _IFeature7.ModelObjects[Obj3dType.o3d_edge];

Как между собой связаны ILineSegment[0], ICircle_[0] и ребра в iObject_ . При выходе из режима редактирования эскиза ILineSegment[0] и ICircle_[0] обнуляются, как я понял IKompasDocument2D перестает существовать. При нахождении в режиме редактирования количество ребер равно нулю.Да количество элементов эскиза и количество ребер может не совпадать, каждое пересечение геометрии в эскизе дает новые ребра.