Проблема задания переменной угла фаски

Автор maksim krotov, 26.08.25, 19:29:00

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

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

maksim krotov

У меня есть следующий код:
using Kompas6API5;
using Kompas6Constants;
using Kompas6Constants3D;
using KompasAPI7;
using System.Runtime.InteropServices;

namespace ConsoleApp3
{
    internal class Program
    {
        static void Main(string[] args)
        {
            KompasObject kompasObject = Marshal.GetActiveObject("KOMPAS.Application.5") as KompasObject;
            IApplication application = kompasObject.ksGetApplication7();
            IKompasDocument document = application.ActiveDocument;
            IPartDocument partDocument = document as IPartDocument;

            IPart7 part7 = partDocument.TopPart;
            ksPart part5 = (ksPart)kompasObject.TransferInterface(part7, (int)ksAPITypeEnum.ksAPI5Auto, (int)Obj3dType.o3d_part);

            IModelContainer modelContainer = (IModelContainer)part7;

            ISketch sketch = modelContainer.Sketchs.Add();
            sketch.Plane = part7.DefaultObject[ksObj3dTypeEnum.o3d_planeXOY];
            sketch.Name = "Эскиз:1";
            sketch.Hidden = false;
            sketch.Angle = 90.0;
            sketch.LeftHandedCS = true;
            sketch.Update();

            IKompasDocument documentSketch = sketch.BeginEdit();

            IKompasDocument2D document2D = (IKompasDocument2D)documentSketch;
            IViewsAndLayersManager viewsAndLayersManager = document2D.ViewsAndLayersManager;
            IView view = viewsAndLayersManager.Views.ActiveView;
            IDrawingContainer drawingContainer = (IDrawingContainer)view;

            ICircle circle = drawingContainer.Circles.Add();
            circle.Style = (int)Kompas6Constants.ksCurveStyleEnum.ksCSNormal;
            circle.Xc = 0.0;
            circle.Yc = 0.0;
            circle.Radius = 19.0;
            circle.Update();

            IVariable7 D = part7.AddVariable("D", 19, "Диаметр");

            viewsAndLayersManager = document2D.ViewsAndLayersManager;
            view = viewsAndLayersManager.Views.ActiveView;
            ISymbols2DContainer symbols2dContainer = (ISymbols2DContainer)view;
            IDiametralDimension diametralDimension = symbols2dContainer.DiametralDimensions.Add();
            diametralDimension.BaseObject = circle;
            diametralDimension.DimensionType = false;
            diametralDimension.Angle = 45;
            diametralDimension.Update();


            IDrawingObject1 drawingObject1 = (IDrawingObject1)diametralDimension;
            IParametriticConstraint parametriticConstraint = drawingObject1.NewConstraint();
            parametriticConstraint = drawingObject1.NewConstraint();
            parametriticConstraint.ConstraintType = Kompas6Constants.ksConstraintTypeEnum.ksCDimWithVariable;
            parametriticConstraint.Variable = "v1";
            parametriticConstraint.Expression = "D";
            parametriticConstraint.Comment = "управляющая переменная размера";
            parametriticConstraint.Create();
     
            parametriticConstraint = drawingObject1.NewConstraint();
            parametriticConstraint.ConstraintType = Kompas6Constants.ksConstraintTypeEnum.ksCFixedDim;
            parametriticConstraint.Create();

            IFeature7 treeSketch = (IFeature7)sketch;
            IVariable7 variableSketch = treeSketch.Variable[false, false, "v1"];
            variableSketch.Expression = "D";

            sketch.EndEdit();

            IExtrusion extrusion = modelContainer.Extrusions.Add(ksObj3dTypeEnum.o3d_bossExtrusion);
            extrusion.Direction = ksDirectionTypeEnum.dtNormal;
            extrusion.Sketch = (Sketch)sketch;
            extrusion.Update();

            IVariable7 H = part7.AddVariable("H", 22, "Высота");
            IVariable7 alpha = part7.AddVariable("alpha", 60, "Угол фаски");


            IFeature7 treeExtrusion = (IFeature7)extrusion;
            object[] variablesExtrusion = treeExtrusion.Variables[false, false];
            foreach (IVariable7 variableExtrusion in variablesExtrusion)
            {
                if (variableExtrusion.ParameterNote == "Расстояние 1")
                {
                    variableExtrusion.Expression = nameof(H);
                    break;
                }
            }

            ksEntity chamfer5 = part5.NewEntity((short)Obj3dType.o3d_chamfer);
            ksChamferDefinition chamfer5Def = chamfer5.GetDefinition();



            ksEntityCollection entityCollection = part5.EntityCollection((short)Obj3dType.o3d_edge);
            ksEntityCollection chamferEdges = chamfer5Def.array();

            chamferEdges.Clear();

            entityCollection.SelectByPoint(0, -D.Value / 2, 0);
            ksEntity edge = entityCollection.First();
            chamferEdges.Add(edge);

            chamfer5.Create();


            IChamfer chamfer7 = (IChamfer)kompasObject.TransferInterface(chamfer5, (int)ksAPITypeEnum.ksAPI7Dual, (int)Obj3dType.o3d_chamfer);

            chamfer7.Angle = 60;
            chamfer7.Distance1 = 5;
            chamfer7.Direction = false;

            chamfer7.BuildingType = ksChamferBuildingTypeEnum.ksChamferSideAngle;

            IFeature7 chamferFeature = (IFeature7)chamfer7;
            object[] chamferVariables = chamferFeature.Variables[false, false];


            foreach (IVariable7 chamferVariable in chamferVariables)
            {
                if (chamferVariable.ParameterNote == "Угол")
                {
                    chamferVariable.Expression = nameof(alpha);
                    break;
                }
            }

            chamfer7.Update();

            part7.Update();

            part7.RebuildModel(true);
        }
    }
}

У меня есть 3 переменных: H (высота цилиндра), D (диаметр цилиндра) и alpha (угол фаски).
Если первые две переменные успешно применяются к размерам, то alpha по какой-то причине нет.

Хмарик

maksim krotov, если при написании ответа вы найдете и нажмете кнопочку "Код"
то ваш код будет выглядеть многократно красивее.
codeusing Kompas6API5;
using Kompas6Constants;
using Kompas6Constants3D;
using KompasAPI7;
using System.Runtime.InteropServices; 

А вручную угол фаски вам удается изменять?

Имя Максим и фамилию Кротов принято писать с Большой буквы.
Форум позволяет регистрироваться много раз. Попробуйте.

p3452

#2
Условие, в последнем "foreach", не отрабатывает...

Попробуйте перед строкой "IFeature7 chamferFeature = (IFeature7)chamfer7;" поставить, дополнительно:
chamfer5.Update();
или
chamfer7.Update();

После этого, параметризация "alpha" будет отрабатывать нормально.

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

maksim krotov

Цитата: p3452 от 27.08.25, 11:34:14Условие, в последнем "foreach", не отрабатывает...

Попробуйте перед строкой "IFeature7 chamferFeature = (IFeature7)chamfer7;" поставить, дополнительно:
chamfer5.Update();
или
chamfer7.Update();

После этого, параметризация "alpha" будет отрабатывать нормально.

 
Спасибо, сработало

maksim krotov

Такой еще вопрос: возможно получить ребро для фаски с помощью 7 API? Просто я реализовал это через API 5 версии

p3452

В свойствах того же chamfer7:
BaseObjects - Массив ребер и граней, на которых строится фаска...

maksim krotov

Про BaseObjects я знаю. Я не знаю, как получить ребра

p3452


maksim krotov

Но как и из чего получить массив ребер?

p3452

Цитата: maksim krotov от 28.08.25, 18:18:14Но как и из чего получить массив ребер?
???
Похоже, код, который Вы дали не Ваш :|, ну, да, ладно...

Сделайте так:
- найдите в конце кода строку "part7.RebuildModel(true);",
- под ЭТОЙ строкой добавте следующий код:
object[] objEdges = (object[]) chamfer7.BaseObjects;
if (objEdges == null)
{ MessageBox.Show("objEdges == null", "Ошибка:");
return;
}
int iedge = 0, iface = 0, inan = 0;
foreach ( var obj in objEdges)
{ if (obj is IEdge)
{ IEdge _edge = obj as IEdge;
//...
iedge++;
}
else
{
if (obj is IFace)
{ IFace _face = obj as IFace;
//...
iface++;
}
else
{ //...
inan++;
}
}
}
MessageBox.Show("iedge = "+ iedge.ToString()+ "\n"
               + "iface = "+ iface.ToString()+ "\n"
               + "inan = "+ inan.ToString());


P/s: там где многоточие, при желании, можете добавить любую свою обработку.
+ Благодарностей: 1