Создание свойства у компонента сборки

Автор maskedball, 24.11.21, 18:16:25

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

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

maskedball

Добрый вечер.
Подскажите пожалуйста, возможно ли программно создать свойство (IProperty) у компонента модели сборки?
Так чтобы это свойство со своим значением было доступно только в сборке у данного конкретного компонента?
И при этом было не доступно в документе детали (или сборки) этого компонента?

p3452

В терминах Компаса:
- "компонент", это Деталь или Сборка,
- "документ" - любой открытый, в Компас, файл.

Лучше формулировку вопроса изменить, или, ждать "экстрасенса".

ИринаФ

Цитата: maskedball от 24.11.21, 18:16:25Добрый вечер.
Подскажите пожалуйста, возможно ли программно создать свойство (IProperty) у компонента модели сборки?
Так чтобы это свойство со своим значением было доступно только в сборке у данного конкретного компонента?
И при этом было не доступно в документе детали (или сборки) этого компонента?
Покажите на картинках, что именно хотите получить.
Какое конкретное свойство?

Slaviation

Добрый день.

# -*- coding: utf-8 -*-

import pythoncom
from win32com.client import Dispatch, gencache, VARIANT

#  Получи константы
kompas6_constants_3d = gencache.EnsureModule("{2CAF168C-7961-4B90-9DA2-701419BEEFE3}", 0, 1, 0).constants

#  Получи API интерфейсов версии 7
kompas_api7_module = gencache.EnsureModule("{69AC2981-37C0-4379-84FD-5DD2F3C0A520}", 0, 1, 0)
kompas_api_object = kompas_api7_module.IKompasAPIObject(Dispatch("Kompas.Application.7")._oleobj_.QueryInterface(kompas_api7_module.IKompasAPIObject.CLSID, pythoncom.IID_IDispatch))
application = kompas_api_object.Application

#  Получи интерфейс активного документа
documents = application.Documents
kompas_document = application.ActiveDocument

#  "Измени свойства объекта "Деталь"
kompas_document_3d = kompas_api7_module.IKompasDocument3D(kompas_document)
property_mng = kompas_api7_module.IPropertyMng(application)
part7 = kompas_document_3d.TopPart.PartsEx(kompas6_constants_3d.ksAllParts)[0]
property_keeper = kompas_api7_module.IPropertyKeeper(part7)

prop_name, prop_value = "Мое новое свойство", "Мое значение нового свойства"
prop = property_mng.GetProperty(kompas_document, prop_name)
if prop is None:
    empty_val = VARIANT(pythoncom.VT_EMPTY, None)
    prop = property_mng.AddProperty(empty_val, empty_val)
    prop.Name = prop_name
    prop.Update()
property_keeper.SetPropertyValue(prop, prop_value, True)
part7.Update()
+ Благодарностей: 1

p3452

Slaviation "спешит на помощь" - респект!

Но! Код - ответ на первый вопрос, а ТС задал ТРИ вопроса.
Причем, третий вопрос (для меня), просто вынос мозга, примерно как фраза "масло - масляное с маслом" :-)))

Slaviation

Вроде с прилагаемым тестом так должно получиться:
Есть открытый документ сборки, в сборке есть компонент. Тест добавляет к документу сборки свойство "Мое новое свойство" и назначает значение этого свойства "Мое значение нового свойства" первому компоненту этой сборки.
Этого свойства не будет в документе - источнике первого компонента (это, надеюсь, к третьему вопросу относится :)).

maskedball

Спасибо за ответы!
Прошу прощения за нечеткую формулировку вопроса.
Имел ввиду следующее:



В своем последнем сообщении Slaviation описывает совершено правильный сценарий!  :sun:

Alexander982

Пытаюсь сделать нечто похожее, только для 2d документа. Хочу читать и менять значение свойства документа на API7.
var iprop = (IPropertyMng)appl;
try
{
 foreach (IProperty p in iprop.GetProperties(null))
 {
     if (p.Name == "Разработал")
     {
        appl.MessageBoxEx($"property found: {p.Name}, {p.ListVal}", "debug", 64);
        p.ListVal = "Иванов";
        p.Update();
        appl.MessageBoxEx($"property : {p.Name}, {p.ListVal}", "debug", 64);
     }
 }
} catch (Exception e)
{
    appl.MessageBoxEx($"error! {e.Message}", "debug", 64);
}

В сообщениях получаю пустые значения. Понимаю что что-то не так делаю с IProperty.ListVal. В примере на python от Slaviation используется тип VARIANT. Как это будет на C#?