• Добро пожаловать на Форум пользователей ПО АСКОН. Пожалуйста, авторизуйтесь.
 

Уважаемые пользователи,

Хотим проинформировать вас о режиме работы регистрации на нашем сайте.

Зарегистрироваться возможно в рабочие дни, с 8:00 до 20:00 (мск).

Если у вас возникнут вопросы или потребуется дополнительная информация, не стесняйтесь обращаться к нашей службе поддержки. Вы можете связаться с нами по указанным контактным данным на нашем сайте.

Благодарим вас за понимание и сотрудничество. Мы ценим ваше терпение и стремимся предоставить вам лучший опыт использования нашего сервиса.

С уважением,
Команда Ascon

как поставить авторазмер в API7

Автор zaytsev, 01.07.24, 16:48:32

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

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

zaytsev

Всем привет!
Подскажите пожалуйста пару моментов, никак не могу разобраться с стороны автоматизации... И макросы смотрел и интернет и форум... (Компас 22+все обновления)

1. Нужно нарисовать окружность + поставить на ней авторазмер задав ему в параметре имя - которое компас автоматом добавляет в переменные модели = как бы получая параметрический эскиз.
...
пробовал и в api5 и в api7 = рисуется отдельно окружность + рисуется отдельно размер ничем не связанные между собой просто позиционированные в 0:0 (код в api7 ниже)
- никак не могу понять каким интерфейсом это (авторазмер) реализуется - вручную я просто выбираю авторазмер+окружность+ставлю имя параметра и все...
если кто знает подскажите пожалуйста где в коде и что нужно добавить...

2. и второй вопрос - не подскажите как в api7 создать внешнюю переменную? в sdk вроде подходит IVariable7, но нигде ни в примерах SDK ни в поиске не нашел его использования даже не знаю как подступиться к нему... в api5 вроде понятно
ksVariableCollection variableCollection = kPart.VariableCollection();
ksVariable diametr_param = variableCollection.AddNewVariable("D", D, "Диаметр");
diametr_param.external = true;
а вот в api7...? 

Спасибо.

код по вопросу
         private void button1_Click(object sender, EventArgs e)
        {
           
            //Приложение
            IApplication app;                               //интеррфейс
                //IDocuments documents;                     //метод
        //Документ
            //Базовые интерфейсы
            IKompasDocument document;                       //интерфейс
                IKompasDocument2D document2D;               //метод
                IKompasDocument3D document3D;               //метод
            //Свойства
            IPropertyMng propertyMng;                       //интерфейс
            IPropertyKeeper propertyKeeper;                 //интерфейс   
        //Документ 2D
            //Геометрия
            IDrawingContainer drawingContainer;
            ICircle circle;
            //Виды и слои
            IViewsAndLayersManager viewsAndLayersManager;   //интерфейс
            //IDrawingObjects
                //IViews views;
            //IDrawingObject drawingObject;
                IView view;                                 //интерфейс
            //Обозначения и размеры
            ISymbols2DContainer symbols2dContainer;
                //Размерры
                    //Коллекции размеров
                    //IDiametralDimensions diametralDimensions;
                    IDiametralDimension diametralDimension;
                    //ILineDimensions lineDimensions;
                    ILineDimension lineDimension;
        //Документ 3D
            //Компоненты
            IPart7 part7;                                   //интерфейс
            //Операции, массивы, эскизы, точки
                //Контейнер
                IModelContainer modelContainer;             //интерфейс
                //Эскиз
                //ISketchs sketchs;
                ISketch sketch;


            //апи7
            app = (IApplication)Marshal.GetActiveObject("KOMPAS.Application.7");
            //создать деталь
//            documents = app.Documents;
            document = app.Documents.Add(Kompas6Constants.DocumentTypeEnum.ksDocumentPart, true);
            document.Active = true;

            document3D = (IKompasDocument3D)document;// kompas_7api.ActiveDocument;
            part7 = document3D.TopPart;

            //свойства
            propertyMng = (IPropertyMng)kompas_7api;
            propertyKeeper = (IPropertyKeeper)part7;
            propertyKeeper.SetPropertyValue(propertyMng.GetProperty(document, "Материал"), "Сталь 10 ГОСТ 1050-2013", true);
            propertyKeeper.SetPropertyValue(propertyMng.GetProperty(document, "Масса"), 0.32074585311827164, true);
            propertyKeeper.SetPropertyValue(propertyMng.GetProperty(document, "Автор"), "123", true);
            propertyKeeper.SetPropertyValue(propertyMng.GetProperty(document, "Наименование"), "Деталь", true);
            propertyKeeper.SetPropertyValue(propertyMng.GetProperty(document, "Рассекать на разрезах"), "Да", true);
            part7.Update();

            //внешние переменные
            //...

            //Эскиз
            document3D = (IKompasDocument3D)kompas_7api.ActiveDocument;
            part7 = document3D.TopPart;
            modelContainer = (IModelContainer)part7;
//            sketchs = modelContainer.Sketchs;
            sketch = modelContainer.Sketchs.Add();
            part7 = document3D.TopPart;
            sketch.Plane = part7.DefaultObject[ksObj3dTypeEnum.o3d_planeXOY];
            sketch.Name = "Эскиз:1";
            sketch.Hidden = false;
            sketch.Angle = 90.0;
            sketch.LeftHandedCS = true;
            sketch.Update();

            //Войди в режим редактирования эскиза
            document = sketch.BeginEdit();

            //"Окружность" (просто окружность)
            document2D = (IKompasDocument2D)document;
            viewsAndLayersManager = document2D.ViewsAndLayersManager;
//            views = viewsAndLayersManager.Views;
            view = viewsAndLayersManager.Views.ActiveView;
            drawingContainer = (IDrawingContainer)view;
//            drawingObject = (IDrawingObject)view;
            //            circles = drawingContainer.Circles;
            circle = drawingContainer.Circles.Add();
            circle.Style = (int)Kompas6Constants.ksCurveStyleEnum.ksCSNormal;
            circle.Xc = 0.0;
            circle.Yc = 0.0;
            circle.Radius = 19.0;
            circle.Update();

            //"Диаметральный размер" (просто размер не связанный ни с чем)
            document2D = (IKompasDocument2D)document;
            viewsAndLayersManager = document2D.ViewsAndLayersManager;
//            views = viewsAndLayersManager.Views;
            view = viewsAndLayersManager.Views.ActiveView;
            symbols2dContainer = (ISymbols2DContainer)view;
//            diametralDimensions = symbols2dContainer.DiametralDimensions;
            diametralDimension = symbols2dContainer.DiametralDimensions.Add();
            diametralDimension.Xc = 0.0;
            diametralDimension.Yc = 0.0;
            diametralDimension.Radius = 10.0;
            diametralDimension.DimensionType = false;
            diametralDimension.Angle = 20.704225;

 //           lineDimensions = symbols2dContainer.LineDimensions;
            lineDimension = symbols2dContainer.LineDimensions.Add();
            IDimensionParams dimension_params = (IDimensionParams)lineDimension;

            dimension_params.InitDefaultValues();
            dimension_params.TextType = Kompas6Constants.ksDimensionTextTypeEnum.ksDimTManual;
            dimension_params.RemoteLine1 = false;
            dimension_params.RemoteLine2 = false;
            dimension_params.ArrowType1 = Kompas6Constants.ksArrowEnum.ksLeaderArrow;
            dimension_params.ArrowType2 = Kompas6Constants.ksArrowEnum.ksLeaderArrow;
            dimension_params.ArrowPos = Kompas6Constants.ksDimensionArrowPosEnum.ksDimArrowAuto;
            dimension_params.TextPos = 48;
            dimension_params.TextOnLine = Kompas6Constants.ksDimensionTextPosEnum.ksDimTextParallelOnLine;
            dimension_params.TextBase = Kompas6Constants.ksDimensionBaseEnum.ksDimBaseP1;
            dimension_params.Gap = true;
            dimension_params.GapValue = 0;

            IDimensionText dimension_text = (IDimensionText)lineDimension;
            dimension_text.Style = (int)Kompas6Constants.ksTextStyleEnum.ksTSDimensionText;
            dimension_text.Sign = 1;
            dimension_text.NominalValue = 38.0;
            dimension_text.AutoNominalValue = true;
            dimension_text.HasTolerance = true;
            dimension_text.ToleranceOn = false;
            dimension_text.DeviationOn = true;
            dimension_text.DeviationType = Kompas6Constants.ksDimensionDeviationEnum.ksDimDeviation;
            dimension_text.Rectangle = false;
            dimension_text.Underline = false;
            dimension_text.Brackets = Kompas6Constants.ksDimensionTextBracketsEnum.ksDimBracketsOff;
            dimension_text.TextAlign = Kompas6Constants.ksDimensionTextAlignEnum.ksDimACentreLowFont;
            diametralDimension.Update();

            //Выйди из режима редактирования эскиза
            sketch.EndEdit();
        }

Вират Лакх

Цитата: zaytsev от 01.07.24, 16:48:322. и второй вопрос - не подскажите как в api7 создать внешнюю переменную? в sdk вроде подходит IVariable7, но нигде ни в примерах SDK ни в поиске не нашел его использования даже не знаю как подступиться к нему... в api5 вроде понятно
а вот в api7...?
https://help.ascon.ru/KOMPAS_SDK/22/ru-RU/ipart7_addvariable.html
https://help.ascon.ru/KOMPAS_SDK/22/ru-RU/ivariable7_external.html

zaytsev

да, это понятно, спасибо
я просто не понимаю как подключить этот интерфейс, по идее это переменные документа=верхний уровень
document = app.Documents.Add(Kompas6Constants.DocumentTypeEnum.ksDocumentPart, true);дальше в sdk этот интерфейс получается от InsertionFragment::Variable(s),IKompasDocument2D1::Variable(s),IView::Variable(s)
и вот тут затык... не понимаю последовательность выхода на интерфейс IVariable7...
т.е.
1. получаю документ
2. от него получаю 2d документ
3. от него документ 2d1
4. от него IVariable7?
вопрос - зачем? когда свойства принадлежат судя по дереву sdk родительскому документу...

Цитата: Вират Лакх от 02.07.24, 07:31:33https://help.ascon.ru/KOMPAS_SDK/22/ru-RU/ipart7_addvariable.html
https://help.ascon.ru/KOMPAS_SDK/22/ru-RU/ivariable7_external.html
если можете, - покажите пару строчек кода api7 как выйти на IVariable7 из IKompasDocument
первый шаг нужен короче )) чтобы с места сдвинуться))

Вират Лакх

Так Вам в 2D или 3D надо? Та ссылка была для модели.

Для 3D:
iKompasDocument = iApplication.ActiveDocument
iKompasDocument3D = API7.IKompasDocument3D(iKompasDocument)
iVariable7 = iKompasDocument3D.TopPart.AddVariable('V', 123, 'Новая')

Для 2D:
iKompasDocument2D1 = API7.IKompasDocument2D1(iKompasDocument)
iVariable7 = iKompasDocument2D1.AddVariable('Vtu', 123, 'Новая')
iKompasDocument2D1.RebuildDocument()
+ Благодарностей: 1

zaytsev

#4
ОГРОМНОЕ СПАСИБО!!!!!!!!!!!!!
off
я в компасе только со стороны API, только по SDK - поэтому не совсем понимаю еще взаимодействие объектов между собой (структуру данных API, хотя-бы в виде наглядного дерева... пытался структуру дерева распарсить со страницы SDK и перевести ее в наглядный Markdown или еще какой формат распечатать и приколотить на стенку :angel: но замучался ul.li раскрывать по всей станице...)


момент для iKompasDocument3D - добавление переменных через IPart7 => iVariable7 мной был полностью упущен

ВТОРОЙ ВОПРОС ПОЛНОСТЬЮ ЗАКРЫТ!!!!
------------------------------------------------------------------------------------------

а по первому вопросу? = создание 3D документа + создание окружности (это наверно уже = создание 2D документа) + простановка авторазмера на ней

https://help.ascon.ru/KOMPAS_SDK/22/ru-RU/idiametraldimension_props.html
//"Окружность" (просто окружность)
            document2D = (IKompasDocument2D)document;
            viewsAndLayersManager = document2D.ViewsAndLayersManager;
            view = viewsAndLayersManager.Views.ActiveView;
            drawingContainer = (IDrawingContainer)view;
            circle = drawingContainer.Circles.Add();
            circle.Style = (int)Kompas6Constants.ksCurveStyleEnum.ksCSNormal;
            circle.Xc = 0.0;
            circle.Yc = 0.0;
            circle.Radius = 19.0;
            circle.Update();

            //"Диаметральный размер" (просто размер не связанный ни с чем)
            document2D = (IKompasDocument2D)document;
            viewsAndLayersManager = document2D.ViewsAndLayersManager;
            view = viewsAndLayersManager.Views.ActiveView;
            symbols2dContainer = (ISymbols2DContainer)view;
            diametralDimension = symbols2dContainer.DiametralDimensions.Add();
если продолжить так
            diametralDimension.Xc = 0.0;
            diametralDimension.Yc = 0.0;
            diametralDimension.Radius = 10.0;
            diametralDimension.DimensionType = false;
            diametralDimension.Angle = 20.704225;
получаем просто центрованный размер не привязанный ни к чему

если продолжить так (от опорного объекта)
            diametralDimension.BaseObject = circle;
            diametralDimension.DimensionType = false;
            diametralDimension.Angle = 20.704225;
получаем размер привязанный к окружности (опорному объекту) фактически авторазмер (наверно) но без параметров в эскизе

а теперь(вместо) этого авторазмера = поставить параметрический авторазмер (см. картинку ниже)
т.е.
1. мы находимися в режиме редактирования
document = sketch.BeginEdit();2. по идее это документ 2D
IKompasDocument2D document2D = (IKompasDocument2D)document;3. на котором есть окружность
ICircle circle = drawingContainer.Circles.Add();4. и нужно выделить эту окружность и поставить авторазмер=создать параметрический размер окружности (добавить параметр к эскизу)

через какой интерфейс это нужно/можно сделать?
через этот - IKompasDocument2D1? аналогично
iVariable7 = iKompasDocument2D1.AddVariable('Vtu', 123, 'Новая')
iKompasDocument2D1.RebuildDocument()
если да то как указать в переменной привязку к окружности?
 
...drawing.png





p3452

Вот в этой ТЕМЕ с форума "Создать внешнюю переменную" есть ссылки на архивы двух примеров (Труба.pyw и test.pyw) - вполне достаточно чтобы "закрыть" ВСЕ Ваши вопросы!
+ Благодарностей: 1

zaytsev

p3452 - ОГРОМНОЕ СПАСИБО!!!! это супер мега круто!! )))
чуть позже переведу на C# положу сюда для памяти и закрою тему

ps
можно вопрос вне темы
эти скрипты были сделаны PyKompasMacro.exe (1.6.45.92) сейчас использую PyKompasMacro (1.7.55.113 от 19.02.2024) (да и то страницу с загрузкой заблокировали пару дней назад...)
и он ни в каком виде (ни в каком порядке построения интересующего вопроса по этой теме) - не отобразил работу с переменными эскиза... (только переменные модели и размеры)... - есть какие-то специальные условия чтобы этот дебагер цеплял все события построения или...? где можно почитать?

еще раз СПАСИБО!


p3452

Цитата: zaytsev от 04.07.24, 15:14:51можно вопрос вне темы
эти скрипты были сделаны PyKompasMacro.exe (1.6.45.92) сейчас использую PyKompasMacro (1.7.55.113 от 19.02.2024) (да и то страницу с загрузкой заблокировали пару дней назад...)
и он ни в каком виде (ни в каком порядке построения интересующего вопроса по этой теме) - не отобразил работу с переменными эскиза... (только переменные модели и размеры)... - есть какие-то специальные условия чтобы этот дебагер цеплял все события построения или...? где можно почитать?

Автор программы PyKompasMacro - Slaviation.
Попробуйте продублировать Ваш вопрос в родной, для программы, Теме - PyKompasMacro
+ Благодарностей: 1

zaytsev

#8
вот что получилось в итоге = C# API7: внешние переменные + переменные эскиза + ограничения = авторазмер (код ниже)
как сказала техподдержка Аскона > Авторазмер это не отдельный объект, это способ построения размера

единственное что непонятно...
1. Окружность на эскизе создается с переменной по умолчанию (например v8), которая исключена из расчета - и непонятно где и зачем используется дальше...
2. Создаю размер в эскизе и в ограничениях задаю новую управляющую переменную размера v1 в которую на этапе создания не получается вставить выражение
parametritic_constraint.Expression = "D/2"; //выражение не сохраняется - хотя это просто строка
и приходится далее обращаться к этой же переменной по имени как к IVariable7 (а не к ограничению в размере IParametriticConstraint) - и указывать выражение уже тут
variable7.Expression = "D/2"; так работает

т.е. создаем переменные в одном месте (интерфейсе) а используем в другом и т.д.
просто как новичку не совсем еще понятна эта логика (может просто это быстрые методы вынесенные в предметные интерфейсы, а тяжелый интерфейс переменных просто лежит в стороне...)

код
private void button1_Click(object sender, EventArgs e)
{
    //апи7
    IApplication app = (IApplication)Marshal.GetActiveObject("KOMPAS.Application.7");
    IKompasDocument document = app.Documents.Add(Kompas6Constants.DocumentTypeEnum.ksDocumentPart, true);
    document.Active = true;

    //свойства
    IKompasDocument3D document3D = (IKompasDocument3D)document;
    IPart7 part7 = document3D.TopPart;
    IPropertyMng propertyMng = (IPropertyMng)kompas_7api;
    IPropertyKeeper propertyKeeper = (IPropertyKeeper)part7;
    IModelContainer modelContainer = (IModelContainer)part7;

    propertyKeeper.SetPropertyValue(propertyMng.GetProperty(document, "Материал"), "Сталь 10 ГОСТ 1050-2013", true);
    propertyKeeper.SetPropertyValue(propertyMng.GetProperty(document, "Масса"), 0.32074585311827164, true);
    propertyKeeper.SetPropertyValue(propertyMng.GetProperty(document, "Автор"), "123", true);
    propertyKeeper.SetPropertyValue(propertyMng.GetProperty(document, "Наименование"), "Деталь", true);
    propertyKeeper.SetPropertyValue(propertyMng.GetProperty(document, "Рассекать на разрезах"), "Да", true);
    part7.Update();

    //внешние переменные
    IVariable7 iVariable7 = document3D.TopPart.AddVariable("D", 23, "диаметр");

    iVariable7.External = true;
    iVariable7 = part7.AddVariable("H", 20, "высота");
    iVariable7.External = true;

    //Эскиз
    ISketch sketch = modelContainer.Sketchs.Add();
    part7 = document3D.TopPart;
    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();

    //Установить Диаметральный размер
    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 drawing_object1 = (IDrawingObject1)diametralDimension;
    IParametriticConstraint parametritic_constraint = drawing_object1.NewConstraint();
    //управляющая переменная размера
    parametritic_constraint = drawing_object1.NewConstraint();
    parametritic_constraint.ConstraintType = Kompas6Constants.ksConstraintTypeEnum.ksCDimWithVariable;
    parametritic_constraint.Variable = "v1";
    parametritic_constraint.Expression = "D/2"; //тут не работает
    parametritic_constraint.Comment = "управляющая переменная размера";   
    parametritic_constraint.Create();
    //фиксированный размер           
    parametritic_constraint = drawing_object1.NewConstraint();
    parametritic_constraint.ConstraintType = Kompas6Constants.ksConstraintTypeEnum.ksCFixedDim;
    parametritic_constraint.Create();
 
    //в дереве построения добавим в переменную размера выражение
    IFeature7 treeSketch = (IFeature7)sketch;
    //   object[] variables = feature7.Variables[false, false];
    IVariable7 variable7 = treeSketch.Variable[false, false, "v1"];
    variable7.Expression = "D/2";              //а тут работает

    //Выйти из режима редактирования эскиза
    sketch.EndEdit();

    //изменить внешнюю переменную
    IFeature7 treePart7 = (IFeature7)part7; //Интерфейс объекта Дерева построения
    IVariable7 var = treePart7.Variable[false, false, "D"];
    var.Value = 44;
    var.Note = "диаметр поменяли в коде";

    document3D.RebuildDocument();
}

UU

Логика абсолютно понятна, есть внутренние переменные, с них начинается логика.

zaytsev

я о том что например новая переменная IVariable7
- создается от IPart7.AddVariable,
- а доступ к ней (если указатель не запоминали при создании) идет от IFeature7.Variable
... вот этот момент немного запутывает - вроде сущность одна а интерфейсы выхода на нее разные...

p3452

Цитата: zaytsev от 09.07.24, 12:42:54как сказала техподдержка Аскона > Авторазмер это не отдельный объект, это способ построения размера
Если Вы задавали вопрос именно по API, то такой ответ свидетельство НЕКОМПЕТЕНТНОСТИ техподдержки!
Авторазмер - это сочетание ОБЪЕКТОВ ДВУХ ТИПОВ:
- размер (диаметральный, линейный,..)
- ограничения (может не быть ни одного, а может и целая группа: Фиксированный размер + Размер с переменной + Ассоциативность).
+ Благодарностей: 1

zaytsev

#12
p3452 - ясно, спасибо!!!! возможно я некорректно задал им вопрос, да и нам с ними еще работать... в любом случае они послали меня обратно на форум сказали здесь все есть))
....
продолжая тему управляемых размеров (на внешних переменных)
допустим из предыдущего примера (продолжая его) делаю выдавливание из эскиза окружности
//объект модели "Операция выдавливания"
IExtrusions extrusions = modelContainer.Extrusions;
IExtrusion extrusion = extrusions.Add(Kompas6Constants3D.ksObj3dTypeEnum.o3d_bossExtrusion);
extrusion.Direction = Kompas6Constants3D.ksDirectionTypeEnum.dtNormal;
extrusion.Name = "Элемент выдавливания:1";
extrusion.Hidden = false;
extrusion.ExtrusionType[true] = Kompas6Constants3D.ksEndTypeEnum.etBlind;
extrusion.DraftOutward[true] = false;
extrusion.DraftValue[true] = 0.0;
extrusion.Depth[true] = 34.0; 

IExtrusion1 extrusion1 = (IExtrusion1)extrusion;
extrusion1.Profile = sketch;// modelContainer.Objects[Kompas6Constants3D.ksObj3dTypeEnum.o3d_sketch][0];
extrusion1.DirectionObject = sketch;// modelContainer.Objects[Kompas6Constants3D.ksObj3dTypeEnum.o3d_sketch][0];
extrusion.Update();

IFeature7 treeExtrusion = (IFeature7)extrusion;
object[] variables = treeExtrusion.Variables[false, false];

получаю цилиндр имеющий 5 переменных
- v18 "Исключить из расчета "
- v21 "Расстояние 1" - здесь высота выдавливания (extrusion.Depth[true] = 34.0; )
- v23 "Угол 1"
- v24 "Расстояние 2"
- v26 "Угол 2"

вопрос
1. как в массиве переменных IFeature7 treeExtrusion найти переменную с расстоянием 1? чтобы выйти на нее и задать выражение
  IVariable7 variable7 = treeSketch.Variable[false, false, "???"];
  variable7.Expression = "Глубина выдавливания - например внешняя переменная H";

- ведь Name ("v21") произвольное...
- ParameterNote ("Расстояние 1") произвольное... (может оно в англицкой локализации другое)
все остальные поля в массиве переменных ~'идентичны' - нет константы что v21 это extrusion.Depth а не что то другое

как поступить в этом случае? как задать выражение переменной выдавливания?

ps
переменные в массиве отличаются параметром HasTolerance = который false для v18 а для остальных true
также отличаются VariableID - но это просто id из базы тоже ни о чем...
...
неужели ориентироваться на индекс массива???!!! а если они сортировку массива изменят...
или есть отдельный метод(ы) запрашиваюшие конкретные имя/значения  для  "Расстояние 1/2" "Угол 1/2"
..
но например метод Depth = iObject.Depth( normal ); вернет значение переменной 'но не ее имя'... и для данного случая (выхода на IVariable7) бесполезен
?

zaytsev

ок, тему пока закрываю,
для параметризации выдавливания привязался к ParameterNote IVariable7, вроде как она заблокирована в плане текста (английской локализации у меня нет не на чем проверить)

код C# API7: - внешние переменные + окружность + выдавливание + параметризация локальных переменных внешними - прикладываю в качестве 'первого шага' может кому пригодится
кстати на гитхабе есть несколько интересных проектов (тоже интересно посмотреть как студенты проектируют) https://github.com/search?q=kompas+3d&type=repositories

всем СПАСИБО!!! за помощь!!!

        private void button1_Click(object sender, EventArgs e)
        {
            //апи7
            IApplication app = (IApplication)Marshal.GetActiveObject("KOMPAS.Application.7");
            IKompasDocument document = app.Documents.Add(Kompas6Constants.DocumentTypeEnum.ksDocumentPart, true);
            document.Active = true;

            //свойства
            IKompasDocument3D document3D = (IKompasDocument3D)document;
            IPart7 part7 = document3D.TopPart;
            IPropertyMng propertyMng = (IPropertyMng)kompas_7api;
            IPropertyKeeper propertyKeeper = (IPropertyKeeper)part7;
            IModelContainer modelContainer = (IModelContainer)part7;

            propertyKeeper.SetPropertyValue(propertyMng.GetProperty(document, "Материал"), "Сталь 10 ГОСТ 1050-2013", true);
            propertyKeeper.SetPropertyValue(propertyMng.GetProperty(document, "Масса"), 0.32074585311827164, true);
            propertyKeeper.SetPropertyValue(propertyMng.GetProperty(document, "Автор"), "123", true);
            propertyKeeper.SetPropertyValue(propertyMng.GetProperty(document, "Наименование"), "Деталь", true);
            propertyKeeper.SetPropertyValue(propertyMng.GetProperty(document, "Рассекать на разрезах"), "Да", true);
            part7.Update();

            //внешние переменные
            IVariable7 iVariable7 = document3D.TopPart.AddVariable("D", 23, "диаметр");

            iVariable7.External = true;
            iVariable7 = part7.AddVariable("H", 20, "высота");
            iVariable7.External = true;

            //Эскиз
            ISketch sketch = modelContainer.Sketchs.Add();
            part7 = document3D.TopPart;
            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();

            //Установить Диаметральный размер
            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 drawing_object1 = (IDrawingObject1)diametralDimension;
            IParametriticConstraint parametritic_constraint = drawing_object1.NewConstraint();
            //управляющая переменная размера
            parametritic_constraint = drawing_object1.NewConstraint();
            parametritic_constraint.ConstraintType = Kompas6Constants.ksConstraintTypeEnum.ksCDimWithVariable;
            parametritic_constraint.Variable = "v1";
            parametritic_constraint.Expression = "D/2"; //тут не работает
            parametritic_constraint.Comment = "управляющая переменная размера";
            parametritic_constraint.Create();
            //фиксированный размер         
            parametritic_constraint = drawing_object1.NewConstraint();
            parametritic_constraint.ConstraintType = Kompas6Constants.ksConstraintTypeEnum.ksCFixedDim;
            parametritic_constraint.Create();

            //в дереве построения добавим в переменную размера выражение
            IFeature7 treeSketch = (IFeature7)sketch;
            //  object[] variables = feature7.Variables[false, false];
            IVariable7 variableSketch = treeSketch.Variable[false, false, "v1"];
            variableSketch.Expression = "D/2";              //а тут работает

            //Выйти из режима редактирования эскиза
            sketch.EndEdit();

            //изменить внешнюю переменную
            IFeature7 treePart7 = (IFeature7)part7; //Интерфейс объекта Дерева построения
            IVariable7 variablePart7 = treePart7.Variable[false, false, "D"];
            variablePart7.Value = 44;
            variablePart7.Note = "диаметр поменяли в коде";

            //объект модели "Операция выдавливания"
            IExtrusions extrusions = modelContainer.Extrusions;
            IExtrusion extrusion = extrusions.Add(Kompas6Constants3D.ksObj3dTypeEnum.o3d_bossExtrusion);
            extrusion.Name = "Элемент выдавливания:1";
            extrusion.Hidden = false;
            //в две стороны
            extrusion.Direction = Kompas6Constants3D.ksDirectionTypeEnum.dtBoth; //в обе стороны

            //"Расстояние 1"
            extrusion.ExtrusionType[true] = Kompas6Constants3D.ksEndTypeEnum.etBlind;
            extrusion.DraftOutward[true] = false;
            extrusion.DraftValue[true] = 0.0;
            extrusion.Depth[true] = 10.0;
            //"Расстояние 2"
            extrusion.ExtrusionType[false] = Kompas6Constants3D.ksEndTypeEnum.etBlind;
            extrusion.DraftOutward[false] = false;
            extrusion.DraftValue[false] = 0.0;
            extrusion.Depth[false] = 22.0;

            IExtrusion1 extrusion1 = (IExtrusion1)extrusion;
            extrusion1.Profile = sketch;// modelContainer.Objects[Kompas6Constants3D.ksObj3dTypeEnum.o3d_sketch][0];
            extrusion1.DirectionObject = sketch;// modelContainer.Objects[Kompas6Constants3D.ksObj3dTypeEnum.o3d_sketch][0];
            extrusion.Update();

            IFeature7 treeExtrusion = (IFeature7)extrusion;
            object[] variablesExtrusion = treeExtrusion.Variables[false, false];
            //параметризируем выдавливание
            foreach (IVariable7 variableExtrusion in variablesExtrusion)
            {
                if (variableExtrusion.ParameterNote == "Расстояние 2")
                {
                    variableExtrusion.Expression = "H*2";
                    break;
                }
            }

            document3D.RebuildDocument();
        }

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

p3452

Цитата: zaytsev от 09.07.24, 19:03:57вопрос
1. как в массиве переменных IFeature7 treeExtrusion найти переменную с расстоянием 1? чтобы выйти на нее и задать выражение
Каждый элемент массива treeExtrusion.Variables[false, false], это переменная (структура) IFeature7.
Весь набор Свойств и Методов в Вашем распоряжении... - ищите ориентируясь на ИЗВЕСТНОЕ - то, что сами задавали.

p/s: Вы занимаетесь ПОЛОВИНЧАТОЙ автоматизацией - зачем создавать программно параметрическую Деталь, когда Вы можете программно создать ГОТОВУЮ деталь?!

p3452


zaytsev

off
меня попросили зайти чисто со стороны sdk, помочь разобраться... компас вижу первый раз в жизни)), но смысл везде один, да и самому интересно было посмотреть как и что у них внутри, так что речь только о структуре данных и возможностях автоматизации, а что и как автоматизировать конкретно это уже совсем другая тема )))) в любом случае круто что есть данный адекватный форум!!!!!!! )))

anton.gorschnev

По поводу невозможности сразу написать формулу надо поменять последовательность создания размера.
Сначала
 //фиксированный размер         
            parametritic_constraint = drawing_object1.NewConstraint();
            parametritic_constraint.ConstraintType = Kompas6Constants.ksConstraintTypeEnum.ksCFixedDim;
            parametritic_constraint.Create();
Потом
 //управляющая переменная размера
            parametritic_constraint = drawing_object1.NewConstraint();
            parametritic_constraint.ConstraintType = Kompas6Constants.ksConstraintTypeEnum.ksCDimWithVariable;
            parametritic_constraint.Variable = "v1";
            parametritic_constraint.Expression = "D/2"; // И тут заработает
            parametritic_constraint.Comment = "управляющая переменная размера";
            parametritic_constraint.Create();

P/s Только у меня сложилось впечатление что объект размера перекочевал из 2D, c кривым допиливанием необходимых для параметризации вещей ?
+ Благодарностей: 1

anton.gorschnev

Цитата: p3452 от 10.07.24, 13:10:27Каждый элемент массива treeExtrusion.Variables[false, false], это переменная (структура) IFeature7.
Весь набор Свойств и Методов в Вашем распоряжении... - ищите ориентируясь на ИЗВЕСТНОЕ - то, что сами задавали.

p/s: Вы занимаетесь ПОЛОВИНЧАТОЙ автоматизацией - зачем создавать программно параметрическую Деталь, когда Вы можете программно создать ГОТОВУЮ деталь?!

На счет половинчатой автоматизации не согласен,если каждый раз отстраивать всю геометрию, ресурсов точно не хватит, гораздо проще изменить значение параметра и получить требуемую модель (проверено при автоматизации Autodesk Inventor). К сожалению пока у меня (только начал изучать) возникает множество вопросов начиная от того как найти требуемый параметр. Допусти первоначально я создал выдавливание кодом, но как получить параметр (переменную,привычка от Autodesk Inventor там это параметры)  отвечающий за величину выдавливания в первую сторону, либо надеяться на неизменность последовательности возвращаемого массива переменных с выдавливания (это плохой варианты не кто не даст гарантии что порядок обхода не измениться) или ориентироваться на какую либо атрибутику например ParameterNote (тоже так себе), хотелось бы ориентироваться на ParameterName значении которого я сам бы и задал при создание выдавливания. Но похоже не получиться, может есть какие други варианты по навигации по переменным. Даже пользовательский функционал мне не удалось поменять имя переменной отвечающие за выдавливание, для переменных эскиза такой проблемы не возникло.       

zaytsev

Цитата: anton.gorschnev от 23.08.24, 11:23:27или ориентироваться на какую либо атрибутику

я вот кстати тоже кроме блокированного (после создания переменной) параметра ParameterNote на нашел к чему привязываться...
системную переменную HasTolerance=false компас ставит сам, остальные уже наши (HasTolerance=true) с именами Name по порядку от существующих...
никакого системного перечисления по типам параметров.. ничего такого не увидел...

остается только ParameterNote... он и не дублируется в конкретном элементе дерева построения и вроде все ок, а если по именам то только удалить и создать переменную снова с нужным именем...- но это както не очень...