Api создание/ добавления свойства детали(модели)

Автор Gefakra, 04.06.20, 10:12:45

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

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

Gefakra

Пытаюсь созданной 3d детали добавить новое свойство (не из существующих в библиотеке) т.е с начало создать его

kompas.Visible = true;
IApplication newAplikation = (IApplication)kompas.ksGetApplication7();         
IKompasDocument kompasDoc = newAplikation.ActiveDocument;         
IPropertyMng newProperty = (IPropertyMng)kompasDoc;   
newProperty.AddProperty("Новое свойство", "123");

делаю согласно справочнику по api. Но тут вылезает ошибка в отладке, что QueryInterface не потдерживается.
Помогите пожалуйста, как добавить новое свойство модели?


Gefakra

Пишу здесь потому что этот раздел самый посещаемый

Создали, тему там и пишите, а разделы, просматриваются все.

DesignЯR

Цитироватьделаю согласно справочнику по api.
Согласно справочнику по API
 IPropertyMng - Дополнительный интерфейс. Данный интерфейс можно получить у IApplication посред­ством вызова метода IUnknown::QueryInterface (const GUID far& iid, void** pif).
а не от  IKompasDocument, как в представленном коде

Gefakra

Согласно справочнику

IKompasDocument kompasDoc = KomApp.ActiveDocument;

IDrawingDocument doc2D = (IDrawingDocument) kompasDoc; // Здесь выполнится QueryInterface

так получаеться IAPLICATION

Gefakra

Цитата: DesignЯR от 04.06.20, 12:21:54Согласно справочнику по API
 IPropertyMng - Дополнительный интерфейс. Данный интерфейс можно получить у IApplication посред­ством вызова метода IUnknown::QueryInterface (const GUID far& iid, void** pif).
а не от  IKompasDocument, как в представленном коде
Согласно справочнику

IKompasDocument kompasDoc = KomApp.ActiveDocument;

IDrawingDocument doc2D = (IDrawingDocument) kompasDoc; // Здесь выполнится QueryInterface

так получаеться IAPLICATION

DesignЯR

Цитироватьkompas.Visible = true;
IApplication newAplikation = (IApplication)kompas.ksGetApplication7();         
IKompasDocument kompasDoc = newAplikation.ActiveDocument;         
IPropertyMng newProperty = (IPropertyMng)kompasDoc;   
newProperty.AddProperty("Новое свойство", "123");
Я к тому что наверно нужно сделать так:
kompas.Visible = true;
IApplication newAplikation = (IApplication)kompas.ksGetApplication7();         
//IKompasDocument kompasDoc = newAplikation.ActiveDocument;         
IPropertyMng newProperty = (IPropertyMng)newAplikation;   
newProperty.AddProperty("Новое свойство", "123");

Gefakra

Цитата: DesignЯR от 04.06.20, 14:50:52Я к тому что наверно нужно сделать так:
kompas.Visible = true;
IApplication newAplikation = (IApplication)kompas.ksGetApplication7();         
//IKompasDocument kompasDoc = newAplikation.ActiveDocument;         
IPropertyMng newProperty = (IPropertyMng)newAplikation;   
newProperty.AddProperty("Новое свойство", "123");
у меня уже эта проблема решена
IApplication newAplikation = (IApplication)kompas.ksGetApplication7();            
IKompasDocument kompasDoc = newAplikation.ActiveDocument;
IPropertyMng newProprty = (IPropertyMng)newAplikation;
newProprty.AddProperty("12","12");

только вот что бы свойство добавилось обьекту нужен IPropertyKeeper, не могу понять как его подключить через IChooseBodies7::Bodies.

ну и соответственно установить значения свойст


Gefakra

вопрос состоит в том - как создать само свойство которе добавляеться в документ через addProperty?

DesignЯR

Вот так вроде можно добавить новое свойство в PropertyMng. По завершению на диске Е создается файл со всеми свойствами документа, среди которых можно найти и созданное...

 
        //----------------------------------------------
        #region Baloon  //для вывода всплывающих сообщений
        public IApplication NewKompasAPI;
        public string BaloonText;
        public void BaloonText_Add(string Line)
        {
            BaloonText = BaloonText + Line + Environment.NewLine;
        }
        public void BaloonText_Clear(string Line)
        {
            BaloonText = "";
        }
        public void Baloon(string message)
        {
            NewKompasAPI.MessageBoxEx(message, "Знаете ли Вы что...", 48);
            BaloonText = "";
        }
        public void Baloon()
        {

            NewKompasAPI.MessageBoxEx(BaloonText, "Знаете ли Вы что...", 48);
            BaloonText = "";
        }
        #endregion
        //----------------------------------------------

        public void Experiment3()
        {
            NewKompasAPI= (_Application)kompas.ksGetApplication7();
            IApplication application = (_Application)kompas.ksGetApplication7();
            if (application != null) { Baloon("application != null"); }
            IKompasDocument kompasdocument = application.ActiveDocument;
            if (kompasdocument != null) { Baloon("kompasdocument!= null"); }
            IKompasDocument2D kompasdocument2d = (IKompasDocument2D)kompasdocument;
            if (kompasdocument2d != null) { Baloon("kompasdocument2d!= null"); }
            IPropertyKeeper propertykeeper = (IPropertyKeeper)kompasdocument2d;
            if (propertykeeper != null) { Baloon("propertykeeper!= null"); }
           
            IPropertyMng propertymng = (IPropertyMng)application;
            if (propertymng != null) { Baloon("propertymng!= null"); }
            Baloon("propertymanager.PropertyCount=" + propertymng.PropertyCount[kompasdocument2d].ToString());

            IProperty property = propertymng.AddProperty(kompasdocument2d, null);
            Baloon("propertymanager.PropertyCount=" + propertymng.PropertyCount[kompasdocument2d].ToString());
            property.Name = "Новое свойство";
            property.Comment = "Из библиотеки";
            property.Update();

            string writePath = @"E:\PropertiesKeeper.txt";
            String text = propertykeeper.Properties as String;
           
            try
            {
             using (StreamWriter sw = new StreamWriter(writePath, false, System.Text.Encoding.Default)) { sw.WriteLine(text); }
             using (StreamWriter sw = new StreamWriter(writePath, true, System.Text.Encoding.Default)) 
             { sw.WriteLine("Дозапись"); sw.Write(text);}
                Baloon("Запись выполнена");
            }
            catch (Exception e)  {; }

        }

p3452

Как вариант:
// Добавить в библ-у "properties.lpt" св-во "addAPI-свойство" типа double
string properyLib = @"C:\Program Files\ASCON\KOMPAS-3D v18\Sys\properties.lpt";
IApplication kompasApp = null;;
IProperty property = null;
IPropertyMng pm = kompasApp as IPropertyMng;
property = pm.AddProperty(properyLib, property);
property.Name = "addAPI-свойство";
property.DataType = ksPropertyTypeEnum.ksPropertyDataTypeDouble;
property.SignificantDigitsCount = 2; // - Количество значащих цифр после запятой
property.Update();

p3452

В коде пропущена пара строк - извиняюсь!
После строки
  IProperty property = null;
надо добавить:
  IApplication kompasApp = (IApplication) Activator.CreateInstance(Type.GetTypeFromProgID("KOMPAS.Application.7"));
  kompasApp.Visible = true;