C# WinForm API7 Привязка к центру координат и размер от линии до точки

Автор zaytsev, 27.08.24, 13:07:10

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

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

zaytsev

Всем привет!
продолжая разборки с апи7 пара вопросов знатокам
во вложении рабочий пример параметризированного снизу вверх конуса (чисто кодом)

вопрос первый (по коду)
- не смог сделать привязку размера на эскизе к центру координат - пришлось искусственно ставить в центр точку, фиксировать ее и привязываться к ней - это верный подход? или можно напрямую привязываться к центру координат эскиза без вспомогательных объектов?
если можно - покажите плиз пример кода привязки к центру этому

вопрос второй (по коду)
- сделал (с помощью техподдержки на примере питона) размер от линии до точки - работает но ничего не понял как работает!!!)))
//параллельный размер (три ограничения длинная линия совпадение точек и точка на коротком отрезке)
ILineDimension parallellineDim = symbols2dContainer.LineDimensions.AddLineSegmentAndPointDimension();
ILineSegmentAndPointDimension parallellineDimnExt = (ILineSegmentAndPointDimension)parallellineDim;
//линия (длинная левая)
parallellineDimnExt.SetBaseObjectPoint(0, line.X1, line.Y1);
parallellineDimnExt.SetBaseObjectPoint(1, line.X2, line.Y2);
//точка (правая на короткой нижней линии)   
parallellineDim.X2 = line3.X2;
parallellineDim.Y2 = line3.Y2;
parallellineDim.Update();

есть основной объект (ILineDimension) + вспомогательный (ILineSegmentAndPointDimension) + два его метода
SetBaseObject - Установить базовый объект
SetBaseObjectPoint - Установить координаты точек базового объекта

подскажите человеческим языком - что они делают?
в описании (SDK) очень мало намеков для экстрасенсов...
по идее SetBaseObject должен бы указывать линию а SetBaseObjectPoint точку до которой строим размер

но на практике
линия указывается через SetBaseObjectPoint(ILineSegmentAndPointDimension ) а точка напрямую через координаты ILineDimension....

при этом при указании линии SetBaseObjectPoint - параметры конца и начала - не отображаются в свойствах этого объекта - а существуют где-то ... не знаю где
по идее (судя по всему) они улетают в родителя (ILineDimension) parallellineDim.X1 и parallellineDim.Y1 но и там их не вижу в отладчике... ))) но работает))) но как???
, и в голове полная непонятность процесса))

какая логика простановки этого размера - у кого есть опыт? 

картинка + проект см.вложение
Компас23 API7 + MSVisualStudio 2022 C# -> WinForm .NET Framework 4.8 Windows10
(папка в проекте с Common =  API Компас *.dll сюда (в тикет) не влезла... - возьмите у себя из C:\Program Files\ASCON\KOMPAS-3D v23\SDK\Samples\Common\*.* или из своего расположения и обновите ссылки в проекте)

p3452

1. Obj3dType или ksObj3dTypeEnum.o3d_pointCS - точка начала системы координат (для любого API)
2. КУЧА информации на форуме и есть STEPы (3шт.) (Работа с API компас в C#. Получение размеров детали.)
3. Интересно в v23 исправили косяк в наименовании линейных размеров? Все размеры назывались одинаково: "Линейный от отрезка до точки".

+ Благодарностей: 1

zaytsev

1. ок, но для простановки размера (ILineDimension) через ограничения (т.е. без указания координат .X1,2 .Y1,2)  +фиксация +внешняя переменная - мне нужен тип IPoint (для центра  координат)
IPoint point = drawingContainer.Points.Add();
который я передаю дальше в parametritic_constraint.Partner (ограничение размера)

...
parametritic_constraint.Comment = "ksCMergePoints 11 Совпадение двух точек";
parametritic_constraint.ConstraintType = (ksConstraintTypeEnum)cnstrType;
parametritic_constraint.Index = 0;           //objBaseIndex;
parametritic_constraint.Partner = point;     //objPartner;
parametritic_constraint.PartnerIndex = 0;    //objPartnerIndex;
parametritic_constraint.Create();

...
при попытке получить точку через перечисление
IPoint point = (IPoint)part7.DefaultObject[ksObj3dTypeEnum.o3d_pointCS];
получаю ошибку - "Невозможно привести COM-объект типа "System.__ComObject" к интерфейсному типу "KompasAPI7.IDrawingObject" Интерфейс не поддерживается... (пока не понимаю как преобразовать o3d_pointCS в IPoint для  parametritic_constraint.Partner)...
мне же нужна точка 2d? я же в эскизе нахожусь...

2 тему с примерами смотрел, но иду от ILineSegmentAndPointDimension (примеров данного интерфейса не нашел)
ps изначально смотрю только на api7

3. косяк в наименовании линейных размеров (в версии 23)? - это где посмотреть (скину скрин)
ps сам компас не использую (нет такой задачи), просто через sdk пишу базовые действия (естественно неоптимально и в лоб)

p3452

1. Трансляция интерфейсов из API5 в API7...
2. Сами виноваты - кто же использует API от крайней версии.
3. Дал же ссылку, там есть скрин, на нем ВСЕ видно! Наименование линейных размеров.png

zaytsev

1,2 no comments - во всех софтах работаю на последних версиях и с техподдержками ловлю их баги )) судьба такой
3 скиньте (zaytsev@cad.ru) этот проект из скрина (желательно на c# или питоне) - покажу как выглядит на 23

p3452

Цитата: zaytsev от 27.08.24, 22:02:153 скиньте (zaytsev@cad.ru) этот проект из скрина (желательно на c# или питоне)
"Ответ - отрицательный" :o: 

anton.gorschnev

Возможно вам будет полезно.
   public void CreateBottomTor(BottomDimensions? Dimensions = null)
        {
            if (Dimensions== null)
            {
                Dimensions = new BottomDimensions(1000, 50, 1000, 100, 10);
            }
            IKompasDocument document = Global.Appl.ActiveDocument;
            IKompasDocument3D document3D = (IKompasDocument3D)document;
           
            if (document3D != null)
            {
                IPart7 part7 = document3D.TopPart;
                if (part7 != null)
                {
                    IModelContainer modelContainer = (IModelContainer)part7;
                    ISketch sketch = modelContainer.Sketchs.Add();
                    part7 = document3D.TopPart;
                    sketch.Plane = part7.DefaultObject[ksObj3dTypeEnum.o3d_planeYOZ];
                    sketch.Name = "#BottomSketch";
                    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;
                    #region Построение геометрии
                    ILineSegment[] ILineSegment_ = new ILineSegment[3];
                    IArc[] IArc_ = new IArc[2];
                    IDrawingObject1 IDrawingObject1_;
                    IParametriticConstraint IParametriticConstraint_;
                    //Горизонтальная линия
                    ILineSegment_[0] = drawingContainer.LineSegments.Add();
                    ILineSegment_[0].Style = (int)Kompas6Constants.ksCurveStyleEnum.ksCSConstruction;
                    ILineSegment_[0].X1 = 0;
                    ILineSegment_[0].Y1 = 0;
                    ILineSegment_[0].X2 = Dimensions.Value.InnerDiameter / 2;
                    ILineSegment_[0].Y2 = 0;
                    ILineSegment_[0].Update();
                    //назначить горизонтальность
                    IDrawingObject1_ = (IDrawingObject1)ILineSegment_[0];
                    IParametriticConstraint_ = IDrawingObject1_.NewConstraint();
                    IParametriticConstraint_.ConstraintType = ksConstraintTypeEnum.ksCHorizontal;
                    IParametriticConstraint_.Create();
                    //назначить фиксацию первой точки
                    IParametriticConstraint_ = IDrawingObject1_.NewConstraint();
                    IParametriticConstraint_.ConstraintType = ksConstraintTypeEnum.ksCFixedPoint;
                    IParametriticConstraint_.Index = 0;
                    IParametriticConstraint_.Create();

                    //Вертикальная осевая  линия
                    ILineSegment_[1] = drawingContainer.LineSegments.Add();
                    ILineSegment_[1].Style = (int)Kompas6Constants.ksCurveStyleEnum.ksCSConstruction;
                    ILineSegment_[1].X1 = 0;
                    ILineSegment_[1].Y1 = 0;
                    ILineSegment_[1].X2 = 0;
                    ILineSegment_[1].Y2 = Dimensions.Value.RadiusTorus * Math.Sin(15 * Math.PI / 180);
                    ILineSegment_[1].Y2 =  (Dimensions.Value.FlangingHeight + Dimensions.Value.RadiusTorus*Math.Sin(15 * Math.PI / 180)+ Dimensions.Value.InnerDiameter/2 * Math.Sin(15 * Math.PI / 180 )) ;
                    ILineSegment_[1].Update();
                    //назначить вертикальность
                    IDrawingObject1_ = (IDrawingObject1)ILineSegment_[1];
                    IParametriticConstraint_ = IDrawingObject1_.NewConstraint();
                    IParametriticConstraint_.ConstraintType = ksConstraintTypeEnum.ksCVertical;
                    IParametriticConstraint_.Create();
                    //назначить совпадение точек
                    IParametriticConstraint_ = IDrawingObject1_.NewConstraint();
                    IParametriticConstraint_.ConstraintType = ksConstraintTypeEnum.ksCMergePoints;
                    IParametriticConstraint_.Index = 0;
                    IParametriticConstraint_.Partner = ILineSegment_[0];
                    IParametriticConstraint_.PartnerIndex = 0;
                    IParametriticConstraint_.Create();

                    //Вертикальная линия борта
                    ILineSegment_[2] = drawingContainer.LineSegments.Add();
                    ILineSegment_[2].Style = (int)Kompas6Constants.ksCurveStyleEnum.ksCSNormal;
                    ILineSegment_[2].X1 = Dimensions.Value.InnerDiameter / 2;
                    ILineSegment_[2].Y1 = 0;
                    ILineSegment_[2].X2 = Dimensions.Value.InnerDiameter / 2;
                    ILineSegment_[2].Y2 = Dimensions.Value.FlangingHeight;
                    ILineSegment_[2].Update();
                    //назначить вертикальность
                    IDrawingObject1_ = (IDrawingObject1)ILineSegment_[2];
                    IParametriticConstraint_ = IDrawingObject1_.NewConstraint();
                    IParametriticConstraint_.ConstraintType = ksConstraintTypeEnum.ksCVertical;
                    IParametriticConstraint_.Create();
                    //назначить совпадение точек
                    IParametriticConstraint_ = IDrawingObject1_.NewConstraint();
                    IParametriticConstraint_.ConstraintType = ksConstraintTypeEnum.ksCMergePoints;
                    IParametriticConstraint_.Index = 0;
                    IParametriticConstraint_.Partner = ILineSegment_[0];
                    IParametriticConstraint_.PartnerIndex = 1;
                    IParametriticConstraint_.Create();

                    //тор
                    IArc_[0] = drawingContainer.Arcs.Add();
                    IArc_[0].Style = (int)Kompas6Constants.ksCurveStyleEnum.ksCSNormal;
                    IArc_[0].Xc = Dimensions.Value.InnerDiameter / 2 - Dimensions.Value.RadiusTorus;
                    IArc_[0].Yc = Dimensions.Value.FlangingHeight;
                    IArc_[0].X1 = Dimensions.Value.InnerDiameter / 2;
                    IArc_[0].Y1 = Dimensions.Value.FlangingHeight;
                    IArc_[0].Angle2 = 15;
                    IArc_[0].Direction = false;
                    IArc_[0].Update();
                   
                    //назначить совпадение точек
                    IDrawingObject1_ = (IDrawingObject1)IArc_[0];
                    IParametriticConstraint_ = IDrawingObject1_.NewConstraint();
                    IParametriticConstraint_.ConstraintType = ksConstraintTypeEnum.ksCMergePoints;
                    IParametriticConstraint_.Index = 1;
                    IParametriticConstraint_.Partner = ILineSegment_[2];
                    IParametriticConstraint_.PartnerIndex = 1;
                    IParametriticConstraint_.Create();
                    //назначить совпадение касательность
                    IParametriticConstraint_ = IDrawingObject1_.NewConstraint();
                    IParametriticConstraint_.ConstraintType = ksConstraintTypeEnum.ksCTangentTwoCurves;
                    IParametriticConstraint_.Partner = ILineSegment_[2];
                    IParametriticConstraint_.Create();

                    //сфера
                    IArc_[1] = drawingContainer.Arcs.Add();
                    IArc_[1].Style = (int)Kompas6Constants.ksCurveStyleEnum.ksCSNormal;
                    IArc_[1].Xc = 0;
                    IArc_[1].Yc = -Dimensions.Value.RadiusSphere +ILineSegment_[1].Y2;
                    IArc_[1].X1 = IArc_[0].X2;
                    IArc_[1].Y1 = IArc_[0].Y2;
                    IArc_[1].Angle2 =90;
                    IArc_[1].Direction = false;
                    IArc_[1].Update();

                    //назначить вертикальность плоложения центра
                    IDrawingObject1_ = (IDrawingObject1)IArc_[1];
                    IParametriticConstraint_ = IDrawingObject1_.NewConstraint();
                    IParametriticConstraint_.ConstraintType = ksConstraintTypeEnum.ksCVAlignPoints;
                    IParametriticConstraint_.Index = 0;
                    IParametriticConstraint_.Partner = ILineSegment_[0];
                    IParametriticConstraint_.PartnerIndex = 0;
                    IParametriticConstraint_.Create();
                    //назначить совпадение точек
                    IParametriticConstraint_ = IDrawingObject1_.NewConstraint();
                    IParametriticConstraint_.ConstraintType = ksConstraintTypeEnum.ksCMergePoints;
                    IParametriticConstraint_.Index = 1;
                    IParametriticConstraint_.Partner = IArc_[0];
                    IParametriticConstraint_.PartnerIndex = 2;
                    IParametriticConstraint_.Create();
                    //назначить совпадение точек
                    IParametriticConstraint_ = IDrawingObject1_.NewConstraint();
                    IParametriticConstraint_.ConstraintType = ksConstraintTypeEnum.ksCMergePoints;
                    IParametriticConstraint_.Index = 2;
                    IParametriticConstraint_.Partner = ILineSegment_[1];
                    IParametriticConstraint_.PartnerIndex = 1;
                    IParametriticConstraint_.Create();
                    //назначить совпадение касательность
                    IParametriticConstraint_ = IDrawingObject1_.NewConstraint();
                    IParametriticConstraint_.ConstraintType = ksConstraintTypeEnum.ksCTangentTwoCurves;
                    IParametriticConstraint_.Partner = IArc_[0];
                    IParametriticConstraint_.Create();

                    #endregion
                    #region Образмеривание
                   
                    //Внешняя переменная для внутреннего диаметра
                    IVariable7 iVariable7 = part7.AddVariable("InnerDiameter", Dimensions.Value.InnerDiameter, "Внутренний диаметр днища");
                    iVariable7.External = true;

                    ISymbols2DContainer symbols2dContainer = (ISymbols2DContainer)viewsAndLayersManager.Views.ActiveView;
                    ILineDimension[] ILineDimension_ = new ILineDimension[2];
                    IRadialDimension[] IRadialDimension_ = new IRadialDimension[2];
                    //радиус днища
                    ILineDimension_[0] = symbols2dContainer.LineDimensions.Add();
                    ILineDimension_[0].X1 = ILineSegment_[0].X1;
                    ILineDimension_[0].Y1 = ILineSegment_[0].Y1;
                    ILineDimension_[0].X2 = ILineSegment_[0].X2;
                    ILineDimension_[0].Y2 = ILineSegment_[0].Y2;
                    ILineDimension_[0].Y3 = ILineSegment_[0].Y1 -20;
                    ILineDimension_[0].X3 = (ILineSegment_[0].X1 + ILineSegment_[0].X2) / 2;
                    ILineDimension_[0].Angle = 0;
                    ILineDimension_[0].Orientation = ksLineDimensionOrientationEnum.ksLinDHorizontal;
                    ILineDimension_[0].Update();
                  
                    IDrawingObject1_ = (IDrawingObject1)ILineDimension_[0];
                    IParametriticConstraint parametritic_constraint = IDrawingObject1_.NewConstraint();
                    //назначить совпадение точек
                    parametritic_constraint = IDrawingObject1_.NewConstraint();
                    parametritic_constraint.ConstraintType = ksConstraintTypeEnum.ksCMergePoints;
                    parametritic_constraint.Index = 0;
                    parametritic_constraint.Partner = ILineSegment_[0];
                    parametritic_constraint.PartnerIndex = 0;
                    parametritic_constraint.Create();

                    parametritic_constraint = IDrawingObject1_.NewConstraint();
                    parametritic_constraint.ConstraintType = ksConstraintTypeEnum.ksCMergePoints;
                    parametritic_constraint.Index = 1;
                    parametritic_constraint.Partner = ILineSegment_[0];
                    parametritic_constraint.PartnerIndex = 1;
                    parametritic_constraint.Create();

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

                    //управляющая переменная размера
                    parametritic_constraint = IDrawingObject1_.NewConstraint();
                    parametritic_constraint.ConstraintType = Kompas6Constants.ksConstraintTypeEnum.ksCDimWithVariable;
                    parametritic_constraint.Variable = "R";
                    parametritic_constraint.Expression = "InnerDiameter/2";
                    parametritic_constraint.Comment = "Внутренний радиус днища";
                    parametritic_constraint.Create();

                    //высота отбортовки
                    ILineDimension_[1] = symbols2dContainer.LineDimensions.Add();
                    ILineDimension_[1].X1 = ILineSegment_[2].X1;
                    ILineDimension_[1].Y1 = ILineSegment_[2].Y1;
                    ILineDimension_[1].X2 = ILineSegment_[2].X2;
                    ILineDimension_[1].Y2 = ILineSegment_[2].Y2;
                    ILineDimension_[1].X3 = ILineSegment_[2].X1 -20;
                    ILineDimension_[1].Y3 = (ILineSegment_[2].Y1 + ILineSegment_[2].Y2) / 2;
                    ILineDimension_[1].Angle = 90;
                    ILineDimension_[1].Orientation = ksLineDimensionOrientationEnum.ksLinDVertical;
                    ILineDimension_[1].Update();
                   
                    IDrawingObject1_ = (IDrawingObject1)ILineDimension_[1];
                    parametritic_constraint = IDrawingObject1_.NewConstraint();
                    //назначить совпадение точек
                    parametritic_constraint = IDrawingObject1_.NewConstraint();
                    parametritic_constraint.ConstraintType = ksConstraintTypeEnum.ksCMergePoints;
                    parametritic_constraint.Index = 0;
                    parametritic_constraint.Partner = ILineSegment_[2];
                    parametritic_constraint.PartnerIndex = 0;
                    parametritic_constraint.Create();

                    parametritic_constraint = IDrawingObject1_.NewConstraint();
                    parametritic_constraint.ConstraintType = ksConstraintTypeEnum.ksCMergePoints;
                    parametritic_constraint.Index = 1;
                    parametritic_constraint.Partner = ILineSegment_[2];
                    parametritic_constraint.PartnerIndex = 1;
                    parametritic_constraint.Create();

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

                    //управляющая переменная размера
                    parametritic_constraint = IDrawingObject1_.NewConstraint();
                    parametritic_constraint.ConstraintType = Kompas6Constants.ksConstraintTypeEnum.ksCDimWithVariable;
                    parametritic_constraint.Variable = "FlangingHeight";
                    parametritic_constraint.Value = Dimensions.Value.FlangingHeight;
                    parametritic_constraint.Comment = "Высота отбортовки днища";
                    parametritic_constraint.Create();

                    //радиус тора
                    IRadialDimension_[0] = symbols2dContainer.RadialDimensions.Add();
                    IRadialDimension_[0].BaseObject = IArc_[0];
                    IRadialDimension_[0].Angle = 30;
                    IRadialDimension_[0].Update();

                    IDrawingObject1_ = (IDrawingObject1)IRadialDimension_[0];
                    parametritic_constraint = IDrawingObject1_.NewConstraint();

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

                    //управляющая переменная размера
                    parametritic_constraint = IDrawingObject1_.NewConstraint();
                    parametritic_constraint.ConstraintType = Kompas6Constants.ksConstraintTypeEnum.ksCDimWithVariable;
                    parametritic_constraint.Variable = "RadiusTorus";
                    parametritic_constraint.Value = Dimensions.Value.RadiusTorus;
                    parametritic_constraint.Comment = "Радиус тора";
                    parametritic_constraint.Create();

                    //радиус сферы
                    IRadialDimension_[1] = symbols2dContainer.RadialDimensions.Add();
                    IRadialDimension_[1].BaseObject = IArc_[1];
                    IRadialDimension_[1].Angle =80;
                    IRadialDimension_[1].Update();

                    IDrawingObject1_ = (IDrawingObject1)IRadialDimension_[1];
                    parametritic_constraint = IDrawingObject1_.NewConstraint();

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

                    //управляющая переменная размера
                    parametritic_constraint = IDrawingObject1_.NewConstraint();
                    parametritic_constraint.ConstraintType = Kompas6Constants.ksConstraintTypeEnum.ksCDimWithVariable;
                    parametritic_constraint.Variable = "RadiusSphere";
                    parametritic_constraint.Value = Dimensions.Value.RadiusSphere;
                    parametritic_constraint.Comment = "Радиус сферы";
                    parametritic_constraint.Create();




                    #endregion
                    sketch.EndEdit();

                    //Внешняя переменная для толщины
                    iVariable7 = part7.AddVariable("Thickness", Dimensions.Value.Thickness, "Толщина стенки днища");
                    iVariable7.External = true;
                    //объект модели "Операция вращение"
                    IRotated IRotated_ = modelContainer.Rotateds.Add(Kompas6Constants3D.ksObj3dTypeEnum.o3d_baseRotated);
                    //IExtrusion extrusion = extrusions.Add(Kompas6Constants3D.ksObj3dTypeEnum.o3d_bossExtrusion);
                    IRotated_.Name = "#Днище торосферическое";
                    IRotated_.Angle[true] = 360;
                    IRotated_.Profile= sketch;
                    IRotated_.Axis = part7.DefaultObject[ksObj3dTypeEnum.o3d_axisOZ];
                    IRotated_.ToroidShapeType = true;
                    ICutRotated ICutRotated_ =(ICutRotated) IRotated_;
                    IThinParameters IThinParameters_ = (IThinParameters)ICutRotated_;
                    IThinParameters_.Thin = true;
                    IThinParameters_.ThinType = ksDirectionTypeEnum.dtNormal;
                    IThinParameters_.Thickness[true] = Dimensions.Value.Thickness;
                    IRotated_.Update();

                    IFeature7 treeExtrusion = (IFeature7)IRotated_;
                    object[] variablesExtrusion = treeExtrusion.Variables[false, false];
                    //параметризируем вращение
                    foreach (IVariable7 variableExtrusion in variablesExtrusion)
                    {
                        if (variableExtrusion.ParameterNote == "Толщина стенки 1")
                        {
                            variableExtrusion.Expression = "Thickness";
                            break;
                        }
                    }
                    #region Назначение атрибутов

                    #endregion
                    document3D.RebuildDocument();


                }
            }

        }